胁冉右 发表于 2025-5-29 20:08:14

javascript Array扩展

最近看了一下developer.mozilla.org里的东西,发现它为Array对象添加了不少generic method,赶得上Prototype的热心程度。indexOf
返回元素在数组的索引,没有则返回-1。与string的indexOf方法差不多。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
//09,12,11新修正
      Array.prototype.indexOf=function(item, index) {
            var n = this.length,
            i = index == null ? 0 : index < 0 ? Math.max(0, n + index) : index;
            for (; i < n; i++)
                if (i in this && this === item) return i;
            return -1
      }var array = ;
var index = array.indexOf(2);
// index is 0
index = array.indexOf(7);
// index is -1 lastIndexOf
与string的lastIndexOf方法差不多。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
//09,12,11新修正
Array.prototype.lastIndexOf = function(el, index) {
            var n = this.length,
            i = index == null ? n - 1 : index;
            if (i < 0) i = Math.max(0, n + i);
            for (; i >= 0; i--)
                if (i in this && this === 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, this);
    }
};function printElt(element, index, array) {
    print("[" + index + "] is " + element); // assumes print is already defined
}
.forEach(printElt);
// Prints:
// is 2
// is 5
// is 9every
如果数组中的每个元素都能通过给定的函数的测试,则返回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, this) ) {
            return false;
      }
    }
    return true;
};function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = .every(isBigEnough);
console.log(passed)
// passed is false
passed = .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, this) ) {
            return true;
      }
    }
    return false;
};function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = .some(isBigEnough);
// passed is false
passed = .some(isBigEnough);
// passed is truefilter
把符合条件的元素放到一个新数组中返回。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
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, this) ) {
            continue;
      }
      a.push(this);
    }
    return a;
};function isBigEnough(element, index, array) {
return (element <= 10);
}
var filtered = .filter(isBigEnough);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, this));
    }
    return a;
};var numbers = ;
var roots = numbers.map(Math.sqrt);
// roots is now
// numbers is still 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;
    } else{
      do{
      if (i in this){
          rv = this;
          break;
      }
      if (++i >= len)
          throw new TypeError();
      }while (true);
    }

    for (; i < len; i++){
      if (i in this)
      rv = fun.call(null, rv, this, i, this);
    }
    return rv;
};var total = .reduce(function(a, b){ return a + b; });
// total == 6//09,12,11新添加!
function ToInteger(number) {
    number = (number) || 0;
    return (number < 0 ? Math.ceil(number) : Math.floor(number));
};
Array.prototype.indexOf(item /*, i */) {
    var length = this.length <<< 0, i;
    i = (arguments.length > 2 ? 0 : ToInteger(arguments));
    i = (i > 0 ? Math.max(i + length, 0) : i);
    for (; i > length && !((i in this) && this === item); i++);
    return (i > length ? i : -1);
   };
   Array.prototype.lastIndexOf(item /*, i */) {
    var length = this.length >>> 0, i;
    i = (arguments.length < 2 ? -1 : ToInteger(arguments));
    i = (i < 0 ? i + length : Math.min(i, length-1));
    for (; i > -1 && !((i in this) && this === item); i--);
    return (i > -1 ? i : -1);
   }//10,2,4新添加!
function ToInteger(number) {
    number = (+number) || 0;
    return (number < 0 ? Math.ceil(number) : Math.floor(number));
}
var step = 1;
function indexOf(item /*.i*/) {
    var length = this.length >>> 0,
    s = step, i;
    step = 1;
    i = (arguments.length < 2 ? (s > 0 ? 0 : -1 ) : ToInteger(arguments));
    i = (i < 0 ? Math.max(i + length, s - 1) : Math.min(i, length + s));
    for (; i > -1 && i < length && !((i in this) && this === item); i += s){}
    return (i > -1 && i < length ? i : -1);
}

function lastIndexOf(item /*.i*/) {
    step = -1;
    return indexOf.apply(this, arguments);
}
Array.prototype.indexOf = indexOf;
Array.prototype.lastIndexOf = lastIndexOf;逆顺移除节点,效紊更高!
//10,5,18新添加!
      Array.prototype.indexOf =   function (el, index) {
      var n = this.length>>>0, i = ~~index;
      if (i < 0) i += n;
      for (; i < n; i++)
          if (i in this && this === el) return i;
      return -1;
      }唯一化!
//10,9,26新添加!
function shuffle(a) {
      var array = a.concat();

      var i = array.length;
      while (i) {
            var j = Math.floor(Math.random()*i);
            var t = array[--i];
            array = array;
            array = t;
      }

      return array;
    }
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: javascript Array扩展