一个对于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 相关文章推荐
一段利用WSH获取登录时间的jscript代码
May 11 Javascript
js 复制或插入Html的实现方法小结
May 19 Javascript
JS生成随机字符串的多种方法
Jun 10 Javascript
jQuery实用技巧必备(中)
Nov 03 Javascript
Node.js 条形码识别程序构建思路详解
Feb 14 Javascript
js 获取当前web应用的上下文路径实现方法
Aug 19 Javascript
巧用canvas
Jan 21 Javascript
Echarts基本用法_动力节点Java学院整理
Aug 11 Javascript
vue自定义全局组件(自定义插件)的用法
Jan 30 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
Apr 19 Javascript
Node.js API详解之 module模块用法实例分析
May 13 Javascript
jquery插件懒加载的示例
Oct 24 jQuery
滚动经典最新话题[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
第十二节--类的自动加载
2006/11/16 PHP
一个简单的PHP&amp;MYSQL留言板源码
2020/07/19 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
php简单实现快速排序的方法
2015/04/04 PHP
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
javascript String 对象
2008/04/25 Javascript
js注意img图片的onerror事件的分析
2011/01/01 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
javascript正则表达式定义(语法)总结
2016/01/08 Javascript
JS验证不重复验证码
2017/02/10 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
shiro授权的实现原理
2017/09/21 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
Linux Centos7.2下安装nodejs&amp;npm配置全局路径的教程
2018/05/15 NodeJs
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
Python3基础之基本数据类型概述
2014/08/13 Python
python+django快速实现文件上传
2016/10/24 Python
Python中PyQt5/PySide2的按钮控件使用实例
2019/08/17 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
初中同学会活动方案
2014/08/22 职场文书
学校食堂标语
2014/10/06 职场文书
五年级上册复习计划
2015/01/19 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
借条格式范本
2015/05/25 职场文书