javascript Array扩展

最近看了一下developer.mozilla.org里的东西,发现它为Array对象添加了不少generic method,赶得上Prototype的热心程度。

indexOf

返回元素在数组的索引,没有则返回-1。与string的indexOf方法差不多。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:


Array.prototype.indexOf = function(el, start) {
    var start = start || 0;
    for ( var i=start; 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.lastIndexOf = function(el, start) {
    var start = start || this.length;
    if ( start >= this.length ) {
        start = this.length;
    }
    if ( start < 0 ) {
         start = this.length + start;
    }
    for ( var i=start; i >= 0; --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);
console.log(passed)
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// passed is true
console.log(passed)

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;
};

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值