一个对于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下判断一个对象是否具有指定名称的属性的的代码
Jan 11 Javascript
javascript检测浏览器flash版本的实现代码
Dec 06 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
Oct 11 Javascript
浅析jquery某一元素重复绑定的问题
Jan 03 Javascript
javascript中声明函数的方法及调用函数的返回值
Jul 22 Javascript
jQuery中prevUntil()方法用法实例
Jan 08 Javascript
javascript去除字符串左右两端的空格
Feb 05 Javascript
jQuery实现带渐显效果的人物多级关系图代码
Oct 16 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
Jan 18 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
Oct 11 Javascript
vue的过滤器filter实例详解
Sep 17 Javascript
Vue实现简单的拖拽效果
Aug 25 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数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
destoon复制新模块的方法
2014/06/21 PHP
30个php操作redis常用方法代码例子
2014/07/05 PHP
php使用cookie实现记住登录状态
2015/04/27 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
python绘制中国大陆人口热力图
2018/11/07 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
Python中整数的缓存机制讲解
2019/02/16 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
python的常见矩阵运算(小结)
2019/08/07 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
Python序列化pickle模块使用详解
2020/03/05 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
python实现定时发送邮件
2020/12/23 Python
Topman美国官网:英国著名的国际平价时尚男装品牌
2017/12/22 全球购物
c语言常见笔试题总结
2016/09/05 面试题
餐饮业的创业计划书范文
2013/12/26 职场文书
证婚人搞笑证婚词
2014/01/10 职场文书
《夹竹桃》教学反思
2014/04/20 职场文书
研究生求职自荐书
2014/06/23 职场文书
新闻学专业求职信
2014/07/28 职场文书
功夫熊猫观后感
2015/06/10 职场文书
三八节祝酒词
2015/08/11 职场文书
移除Selenium中window.navigator.webdriver值
2022/06/10 Python