JavaScript Array扩展实现代码


Posted in Javascript onOctober 14, 2009

indexOf
返回元素在数组的索引,没有则返回-1。与string的indexOf方法差不多。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:

Array.prototype.indexOf = function(el, start) { 
    var start = start || 0; 
    for ( var i=0; i < this.length; ++i ) { 
        if ( this[i] === el ) { 
            return i; 
        } 
    } 
    return -1; 
}; 
var array = [2, 5, 9]; 
var index = array.indexOf(2); 
// index is 0 
index = array.indexOf(7); 
// index is -1

lastIndexOf
与string的lastIndexOf方法差不多。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.indexOf = function(el, start) { 
    var start = start || 0; 
    for ( var i=0; i < this.length; ++i ) { 
        if ( this[i] === el ) { 
            return i; 
        } 
    } 
    return -1; 
};

forEach
各类库中都实现相似的each方法。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.forEach = function(fn, thisObj) { 
    var scope = thisObj || window; 
    for ( var i=0, j=this.length; i < j; ++i ) { 
        fn.call(scope, this[i], i, this); 
    } 
}; 
function printElt(element, index, array) { 
    print("[" + index + "] is " + element); // assumes print is already defined 
} 
[2, 5, 9].forEach(printElt); 
// Prints: 
// [0] is 2 
// [1] is 5 
// [2] is 9

every
如果数组中的每个元素都能通过给定的函数的测试,则返回true,反之false。换言之给定的函数也一定要返回true与false
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.every = function(fn, thisObj) { 
    var scope = thisObj || window; 
    for ( var i=0, j=this.length; i < j; ++i ) { 
        if ( !fn.call(scope, this[i], i, this) ) { 
            return false; 
        } 
    } 
    return true; 
}; 
function isBigEnough(element, index, array) { 
  return (element <= 10); 
} 
var passed = [12, 5, 8, 130, 44].every(isBigEnough); 
// passed is false 
passed = [12, 54, 18, 130, 44].every(isBigEnough); 
// passed is true

some
类似every函数,但只要有一个通过给定函数的测试就返回true。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.some = function(fn, thisObj) { 
    var scope = thisObj || window; 
    for ( var i=0, j=this.length; i < j; ++i ) { 
        if ( fn.call(scope, this[i], i, this) ) { 
            return true; 
        } 
    } 
    return false; 
}; 
function isBigEnough(element, index, array) { 
  return (element >= 10); 
} 
var passed = [2, 5, 8, 1, 4].some(isBigEnough); 
// passed is false 
passed = [12, 5, 8, 1, 4].some(isBigEnough); 
// passed is true

filter
把符合条件的元素放到一个新数组中返回。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.filter = function(fn, thisObj) { 
    var scope = thisObj || window; 
    var a = []; 
    for ( var i=0, j=this.length; i < j; ++i ) { 
        if ( !fn.call(scope, this[i], i, this) ) { 
            continue; 
        } 
        a.push(this[i]); 
    } 
    return a; 
}; 
function isBigEnough(element, index, array) { 
  return (element <= 10); 
} 
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);

map
让数组中的每一个元素调用给定的函数,然后把得到的结果放到新数组中返回。。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.map = function(fn, thisObj) { 
    var scope = thisObj || window; 
    var a = []; 
    for ( var i=0, j=this.length; i < j; ++i ) { 
        a.push(fn.call(scope, this[i], i, this)); 
    } 
    return a; 
}; 
<div id="highlighter_240589"> 
var numbers = [1, 4, 9]; 
var roots = numbers.map(Math.sqrt); 
// roots is now [1, 2, 3] 
// numbers is still [1, 4, 9]

reduce
让数组元素依次调用给定函数,最后返回一个值,换言之给定函数一定要用返回值。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.reduce = function(fun /*, initial*/) 
{ 
  var len = this.length >>> 0; 
  if (typeof fun != "function") 
    throw new TypeError(); 
  if (len == 0 && arguments.length == 1) 
    throw new TypeError(); 
  var i = 0; 
  if (arguments.length >= 2){ 
    var rv = arguments[1]; 
  } else{ 
    do{ 
      if (i in this){ 
        rv = this[i++]; 
        break; 
      } 
      if (++i >= len) 
        throw new TypeError(); 
    }while (true); 
  }   for (; i < len; i++){ 
    if (i in this) 
      rv = fun.call(null, rv, this[i], i, this); 
  } 
  return rv; 
};

var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; }); 
// total == 6
Javascript 相关文章推荐
javascript得到XML某节点的子节点个数的脚本
Oct 11 Javascript
Input 特殊事件onpopertychange和oninput
Jun 17 Javascript
js cookies实现简单统计访问次数
Nov 24 Javascript
jQuery contains过滤器实现精确匹配使用方法
Apr 12 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
Jul 12 Javascript
Google Maps基础及实例解析
Aug 06 Javascript
详解jQuery停止动画——stop()方法的使用
Dec 14 Javascript
vue.js利用defineProperty实现数据的双向绑定
Apr 28 Javascript
Vue2.X 通过AJAX动态更新数据
Jul 17 Javascript
vue中 this.$set的用法详解
Sep 06 Javascript
在vue-cli中引入lodash.js并使用详解
Nov 13 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
Nov 11 Javascript
JavaScript 动态创建VML的方法
Oct 14 #Javascript
JavaScript读取中文cookie时的乱码问题的解决方法
Oct 14 #Javascript
jQuery 标题的自动翻转实现代码
Oct 14 #Javascript
JavaScript 替换Html标签实现代码
Oct 14 #Javascript
JavaScript null和undefined区别分析
Oct 14 #Javascript
JavaScript iframe的相互操作浅析
Oct 14 #Javascript
使用jQuery简化Ajax开发 Ajax开发入门
Oct 14 #Javascript
You might like
php中神奇的fastcgi_finish_request
2011/05/02 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
2015/05/09 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
IE本地存储userdata的一个bug说明
2010/07/01 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
javascript实现别踩白块儿小游戏程序
2015/11/22 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
2016/09/08 Javascript
常用原生js自定义函数总结
2016/11/20 Javascript
jquery 正整数数字校验正则表达式
2017/01/10 Javascript
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
vue+element+Java实现批量删除功能
2019/04/08 Javascript
运用js实现图层拖拽的功能
2019/05/24 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
Python Lambda函数使用总结详解
2019/12/11 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
Python发送邮件实现基础解析
2020/08/14 Python
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
会计专业毕业生自我评价
2013/09/25 职场文书
2013英文求职信模板范文
2013/11/15 职场文书
门卫人员岗位职责
2013/12/24 职场文书
党委班子对照检查材料
2014/08/19 职场文书
在教室放鞭炮的检讨书
2014/09/28 职场文书
学习党史心得体会2016
2016/01/23 职场文书
2016党风廉政建设心得体会范文
2016/01/25 职场文书
Anaconda安装pytorch及配置PyCharm 2021环境
2021/06/04 Python
源码解读Spring-Integration执行过程
2021/06/11 Java/Android