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 相关文章推荐
jQuery 美元符冲突的解决方法
Mar 28 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
Jul 03 Javascript
JavaScript中的console.assert()函数介绍
Dec 29 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
Mar 24 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
Aug 20 Javascript
JQuery.validationEngine表单验证插件(推荐)
Dec 10 Javascript
原生javascript实现分页效果
Apr 21 Javascript
详解基于electron制作一个node压缩图片的桌面应用
Jan 29 Javascript
d3.js 地铁轨道交通项目实战
Nov 27 Javascript
VUE Elemen-ui之穿梭框使用方法详解
Jan 19 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
Jan 19 Javascript
vue-router懒加载的3种方式汇总
Feb 28 Vue.js
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语法(2)
2006/10/09 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
PHP中soap的用法实例
2014/10/24 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
JS实现随机数生成算法示例代码
2013/08/08 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
JavaScript改变CSS样式的方法汇总
2015/05/07 Javascript
基于JavaScript代码实现随机漂浮图片广告
2016/01/05 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
零基础写python爬虫之打包生成exe文件
2014/11/06 Python
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
详解Python中的各种函数的使用
2015/05/24 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
python识别验证码图片实例详解
2020/02/17 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
jupyter实现重新加载模块
2020/04/16 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
电子商务个人自荐信
2013/12/12 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
2016国培研修心得体会
2016/01/08 职场文书
python实现简单的聊天小程序
2021/07/07 Python
Python+Tkinter制作专属图形化界面
2022/04/01 Python
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python