一个对于Array的简单扩展


Posted in Javascript onOctober 03, 2006

其实就是 prototype 1.4中 枚举对象部分 的简化版本, 
先贴代码,等下再一一解释,对初学者可能有帮助 

最近一直在学习Python,一直感叹于python中 list的灵活, 
同样都是数组,为什么javascript不能和python中的一样灵活呢, 
(其实下面这些 prototype 1.4已经实现了,不过 prototype太胖了,你知道的,我对胖女人不感兴趣) 
于是就有了下面的代码.....  

<script> 
Array.prototype.map = function(f) {   
  var arr=[] 
  for(var i=0;i<this.length;i++) arr.push(f(this[i])) 
  return arr   
} Array.prototype.each = function(f) {  
  for(var i=0;i<this.length;i++) f(this[i]) 
} 
Array.prototype.find = function(f) {   
  for(var i=0;i<this.length;i++)  if (f(this[i])) return this[i] 
  return null 
} 
Array.prototype.findAll = function(f) {  
  var arr=[] 
  for(var i=0;i<this.length;i++)  if (f(this[i])) arr.push(this[i]) 
  return arr 
} 
Array.prototype.getPart = function(f) {    
  for(var i=0;i<this.length;i++)  if (f(this[i])) return [this.slice(0,i+1),this.slice(i+1)] 
} 

Array.prototype.all = function(f) {  
  for(var i=0;i<this.length;i++)  if (!f(this[i])) return false 
  return true 
} 
Array.prototype.any = function(f) {  
  for(var i=0;i<this.length;i++)  if (f(this[i])) return true 
  return false 
} 
Array.prototype.grep = function(regex,f) {  
  var arr=[] 
  for(var i=0;i<this.length;i++){ 
     if (this[i].toString().match(regex)) arr.push((f || function(x){return x})(this[i])) 
  }   
  return arr 
} 
Array.prototype.include = function(v) {  
  for(var i=0;i<this.length;i++)  if (this[i]==v) return true 
  return false 
} 
Array.prototype.indexOf = function(v) {  
  for(var i=0;i<this.length;i++)  if (this[i]==v) return i 
  return -1 
} 
Array.prototype.inject = function(v,f) {  
  var vv=v 
  for(var i=0;i<this.length;i++)  vv=f(vv,this[i]) 
  return vv 
} 
Array.prototype.max=function(){ 
  var v=this[0]; 
  for(var i=0;i<this.length;i++)  if (this[i]>v) v=this[i] 
  return v 
} 
Array.prototype.min=function(){ 
  var v=this[0]; 
  for(var i=0;i<this.length;i++)  if (this[i]<v) v=this[i] 
  return v 
} 
Array.prototype.partition = function(f) {  
  var arr1=[],arr2=[] 
  for(var i=0;i<this.length;i++)  f(this[i])?arr1.push(this[i]):arr2.push(this[i]) 
  return [arr1,arr2] 
} 
</script> 
<textarea id=o> 
这里有很多文本和script块,而且script块的数目不定 
<script>alert(1)</script> 
<script> 
function fff(){ 
alert("fff function") 
} 
fff()</script> 
<script>alert("last alert()")</script> 
</textarea> 
<script> 
//对数组中每个元素都调用函数f执行,并把执行的结果按数组原排列顺序返回,返回一个数组 
Array.prototype.map = function(f) {   
  var arr=[] 
  for(var i=0;i<this.length;i++) arr.push(f(this[i])) 
  return arr   
} 
//对数组中每个元素都调用函数f执行,只执行,不返回结果 
Array.prototype.each = function(f) {   
  for(var i=0;i<this.length;i++) f(this[i]) 
} 
//最简单的例子 
var arr=[3,1,5,2,7] 
var arr2=arr.map(function(x){return x*x}) 
alert(arr2) 
//取整 
var arr3=[3.121,1.555,5.8,2.0,7.9] 
var arr4=arr3.map(Math.round) 
alert(arr4) 

//返回数组中每个字符串的长度 
var a1=["dasfsdfas","dasffdfs","ds","2","cccccc"] 
var a2=a1.map(function(x){return x.length}) 
alert(a2) 

//这个例子比较常用,比如用ajax抓了一个页面,怎么执行页面中的所有script块呢? 
var f=function(s){return s.replace(/^<script.*?>/,"").replace(/<\/script>$/,"")} 
o.value.match(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/gi).map(f).each(eval) 
//更复杂的例子 
//  http://community.csdn.net/Expert/topic/4796/4796192.xml?temp=.2977564 
</script> 

<script> 
//获取第一个使函数f为真的元素,如果找不到返回null 
Array.prototype.find = function(f) {   
  for(var i=0;i<this.length;i++)  if (f(this[i])) return this[i] 
  return null 
} 
//获取所有使函数f为真的元素,如果找不到返回空数组 
Array.prototype.findAll = function(f) {  
  var arr=[] 
  for(var i=0;i<this.length;i++)  if (f(this[i])) arr.push(this[i]) 
  return arr 
} 
//在数组中找一个偶数 
var arr=[3,1,5,2,7,8,1,0,10] 
var v=arr.find(function(x){return x%2==0}) 
alert(v) 
//找所有偶数 
var arr2=arr.findAll(function(x){return x%2==0}) 
alert(arr2) 
</script> 
<script> 
//返回一个包含两个元素的数组。这两个元素都是一个数组 arr1是所有能让f为真的元素组成的数组 arr2是剩下的元素 
Array.prototype.partition = function(f) {  
  var arr1=[],arr2=[] 
  for(var i=0;i<this.length;i++)  f(this[i])?arr1.push(this[i]):arr2.push(this[i]) 
  return [arr1,arr2] 
} 
//只有数组中所有元素都能让f为真才返回真 
Array.prototype.all = function(f) {  
  for(var i=0;i<this.length;i++)  if (!f(this[i])) return false 
  return true 
} 
//只要存在任何一个元素能让f为真就返回真 
Array.prototype.any = function(f) {  
  for(var i=0;i<this.length;i++)  if (f(this[i])) return true 
  return false 
} 
//寻找偶数和奇数 
var arr=[3,1,5,2,7,8,1,0,10] 
var a=arr.partition(function(x){return x%2==0}) 
alert(a[0])  //返回所有偶数 
alert(a[1])  //所有奇数 
var b=arr.all(function(x){return x%2==0})  //检查是不是数组中所有元素都是偶数 
var c=arr.any(function(x){return x%2==0})  //检查数组中是不是存在偶数 
alert(b) 
alert(c) 
</script> 
Array.prototype.grep = function(regex,f)  
用给出的正则表达式去匹配数组中的每一个元素, 
对符合匹配的元素返回一个数组,当然,如果存在函数f,匹配结果还要通过函数f的处理 
if (!Array.prototype.push){   //好象 ie5.0以下不支持 push()方法 
    Array.prototype.push=function(){ 
         for(var i=0;i<arguments.length;i++){ 
             this [this.length]  =  arguments[i]; 
        } 
         return this.length; 
    } 
} 
//var arr=[] 
//arr.push("1","2","3")
Javascript 相关文章推荐
jquery调取json数据实现省市级联的方法
Jan 29 Javascript
js实现文件上传表单域美化特效
Nov 02 Javascript
BootStrap glyphicons 字体图标实现方法
May 01 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
Nov 21 Javascript
原生js实现商品放大镜效果
Jan 12 Javascript
详解Vue 动态添加模板的几种方法
Apr 25 Javascript
JS倒计时实例_天时分秒
Aug 22 Javascript
JQuery通过后台获取数据遍历到前台的方法
Aug 13 jQuery
JS实现点击拉拽轮播图pc端移动端适配
Sep 05 Javascript
Vue如何将页面导出成PDF文件
Aug 17 Javascript
基于jQuery拖拽事件的封装
Nov 29 jQuery
vue-router定义元信息meta操作
Dec 07 Vue.js
滚动经典最新话题[prototype框架]下编写
Oct 03 #Javascript
图片自动更新(说明)
Oct 02 #Javascript
在线游戏大家来找茬II
Sep 30 #Javascript
静态页面的值传递(三部曲)
Sep 25 #Javascript
关于Blog顶部的滚动导航条代码
Sep 25 #Javascript
初学prototype,发个JS接受URL参数的代码
Sep 25 #Javascript
浅谈JavaScript中面向对象技术的模拟
Sep 25 #Javascript
You might like
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
php自定义错误处理用法实例
2015/03/20 PHP
WordPress的主题编写中获取头部模板和底部模板
2015/12/28 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
深入讲解PHP的对象注入(Object Injection)
2017/03/01 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
2010/03/07 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
用JavaScript实现动画效果的方法
2013/07/20 Javascript
js编码、解码函数介绍及其使用示例
2013/09/05 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
python读取html中指定元素生成excle文件示例
2014/04/03 Python
python中类的一些方法分析
2014/09/25 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
GC是什么?为什么要有GC?
2013/12/08 面试题
离婚协议书范文2014
2014/10/16 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
Golang 入门 之url 包
2022/05/04 Golang
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python