一个对于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 相关文章推荐
最新优化收藏到网摘代码(digg,diigo)
Feb 07 Javascript
JavaScript Scoping and Hoisting 翻译
Jul 03 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
May 29 Javascript
jquery库文件略庞大用纯js替换jquery的方法
Aug 12 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
Apr 01 Javascript
js验证真实姓名与身份证号,手机号的简单实例
Jul 18 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
Jul 20 Javascript
js判断数组是否包含某个字符串变量的实例
Nov 24 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
Sep 02 Javascript
在layui下对元素进行事件绑定的实例
Sep 06 Javascript
详解vue路由
Aug 05 Javascript
10分钟学会js处理json的常用方法
Dec 06 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
【COS正片】蕾姆睡衣cos,纯洁可爱被治愈了 cn名濑弥七
2020/03/02 日漫
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
php&amp;java(二)
2006/10/09 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
PHP通用检测函数集合
2011/02/08 PHP
Smarty foreach控制循环次数的实现详解
2013/07/03 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
2014/01/14 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
document.getElementBy(&quot;id&quot;)与$(&quot;#id&quot;)有什么区别
2013/09/22 Javascript
jquery ajax 调用失败的原因示例介绍
2013/09/27 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
javascript的document.referrer浏览器支持、失效情况总结
2014/07/18 Javascript
JavaScript 学习笔记之操作符
2015/01/14 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
Vue入门之数据绑定(小结)
2018/01/08 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
python实现微信自动回复机器人功能
2019/07/11 Python
python 日期排序的实例代码
2019/07/11 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
JSF的标签库有哪些
2012/04/27 面试题
工程管理造价应届生求职信
2013/11/13 职场文书
法律进机关实施方案
2014/03/12 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
社区植树节活动总结
2015/02/06 职场文书