JavaScript Array扩展实现代码

 更新时间:2009年10月14日 19:24:47   作者:  
最近看了一下developer.mozilla.org里的东西,发现它为Array对象添加了不少generic method,赶得上Prototype的热心程度。
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

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 &gt;&gt;&gt; 0;
  if (typeof fun != &quot;function&quot;)
    throw new TypeError();
  if (len == 0 &amp;&amp; arguments.length == 1)
    throw new TypeError();
  var i = 0;
  if (arguments.length &gt;= 2){
    var rv = arguments[1];
  } else{
    do{
      if (i in this){
        rv = this[i++];
        break;
      }
      if (++i &gt;= len)
        throw new TypeError();
    }while (true);
  }

  for (; i &lt; 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

相关文章

  • 微信小程序使用this.setData()遇到的问题及解决方案详解

    微信小程序使用this.setData()遇到的问题及解决方案详解

    this.setData估计是小程序中最经常用到的一个方法,但是要注意其实他是有限制的,忽略这些限制的话,会导致数据无法更新,下面这篇文章主要给大家介绍了关于微信小程序使用this.setData()遇到的问题及解决方案,需要的朋友可以参考下
    2022-08-08
  • JavaScript进阶之函数和对象知识点详解

    JavaScript进阶之函数和对象知识点详解

    为了让大家更加深入地了解JavaScript。这篇文章主要介绍了JavaScript中函数和对象知识点,文中的示例代码讲解详细,感兴趣的可以学习一下
    2022-07-07
  • layer.open属性详解及layer.open弹出框使用post方法举例

    layer.open属性详解及layer.open弹出框使用post方法举例

    这篇文章主要给大家介绍了关于layer.open属性详解及layer.open弹出框使用post方法的相关资料,最近接触到layer弹窗,感觉弹窗功能异常强大,真的很方便,所以记录下来,需要的朋友可以参考下
    2023-12-12
  • JavaScript实现简易计算器案例

    JavaScript实现简易计算器案例

    这篇文章主要为大家详细介绍了JavaScript实现简易计算器案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>
    2022-07-07
  • js实现网页计算器

    js实现网页计算器

    这篇文章主要为大家详细介绍了js实现网页计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • uniapp自定义网络检测组件项目实战总结分析

    uniapp自定义网络检测组件项目实战总结分析

    这篇文章主要为大家介绍了uniapp自定义网络检测组件项目实战总结分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 小程序圆形进度条及面积图实现的方法

    小程序圆形进度条及面积图实现的方法

    做微信小程序的朋友大都接触过或自己动手写过自定义组件,下面这篇文章主要给大家介绍了关于小程序圆形进度条及面积图实现的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • JavaScript控制语句及搭建前端服务器的过程详解

    JavaScript控制语句及搭建前端服务器的过程详解

    这篇文章主要介绍了JavaScript控制语句及搭建前端服务器,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • JavaScript原生开发视频播放器的实现代码

    JavaScript原生开发视频播放器的实现代码

    这篇文章我们将一起探索一份自定义的视频播放器实现代码,甚至还可以实现有弹幕功能,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-06-06
  • 求数组最大最小值方法适用于任何数组

    求数组最大最小值方法适用于任何数组

    之前虽然介绍过一种求数组最大最小值的方法,但那个方法只是用于数组中都是数字的,下面为大家介绍个方法适用于任何数组,有此需求的朋友可以参考下
    2013-08-08

最新评论

?


http://www.vxiaotou.com