一个对于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 相关文章推荐
深入理解JavaScript系列(44):设计模式之桥接模式详解
Mar 04 Javascript
php结合imgareaselect实现图片裁剪
Jul 05 Javascript
js中利用tagname和id获取元素的方法
Jan 03 Javascript
javascript的函数劫持浅析
Sep 26 Javascript
Angular2学习笔记——详解NgModule模块
Dec 02 Javascript
Vue 实用分页paging实例代码
Apr 12 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
Jul 28 Javascript
JS使用tofixed与round处理数据四舍五入的区别
Oct 25 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
Dec 31 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
Sep 26 Javascript
JavaScript实现的拼图算法分析
Feb 13 Javascript
JS实现可视化音频效果的实例代码
Jan 16 Javascript
滚动经典最新话题[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调用mysql存储过程
2007/02/14 PHP
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
js同时按下两个方向键
2007/12/01 Javascript
JavaScript下申明对象的几种方法小结
2008/10/02 Javascript
jquery 3D 标签云示例代码
2014/06/12 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
vue项目部署上线遇到的问题及解决方法
2018/06/10 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
JS删除对象中某一属性案例详解
2020/09/08 Javascript
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
浅谈Django中view对数据库的调用方法
2019/07/18 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
工程造价专业大学生自荐信
2013/10/01 职场文书
四年大学生活的个人自我评价
2013/12/11 职场文书
新护士岗前培训制度
2014/02/02 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
放飞理想主题班会
2015/08/14 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
深入理解python协程
2021/06/15 Python
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android