找回密码
 立即注册
首页 业界区 业界 javascript Array扩展

javascript Array扩展

胁冉右 2025-5-29 20:08:14
最近看了一下developer.mozilla.org里的东西,发现它为Array对象添加了不少generic method,赶得上Prototype的热心程度。indexOf
返回元素在数组的索引,没有则返回-1。与string的indexOf方法差不多。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. //09,12,11新修正
  2.       Array.prototype.indexOf=function(item, index) {
  3.             var n = this.length,
  4.             i = index == null ? 0 : index < 0 ? Math.max(0, n + index) : index;
  5.             for (; i < n; i++)
  6.                 if (i in this && this[i] === item) return i;
  7.             return -1
  8.       }
复制代码
  1. var array = [2, 5, 9];
  2. var index = array.indexOf(2);
  3. // index is 0
  4. index = array.indexOf(7);
  5. // index is -1
复制代码
lastIndexOf
与string的lastIndexOf方法差不多。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. //09,12,11新修正
  2. Array.prototype.lastIndexOf = function(el, index) {
  3.             var n = this.length,
  4.             i = index == null ? n - 1 : index;
  5.             if (i < 0) i = Math.max(0, n + i);
  6.             for (; i >= 0; i--)
  7.                 if (i in this && this[i] === el) return i;
  8.             return -1
  9. };
复制代码
forEach  
各类库中都实现相似的each方法。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. Array.prototype.forEach = function(fn, thisObj) {
  2.     var scope = thisObj || window;
  3.     for ( var i=0, j=this.length; i < j; ++i ) {
  4.         fn.call(scope, this[i], i, this);
  5.     }
  6. };
复制代码
  1. function printElt(element, index, array) {
  2.     print("[" + index + "] is " + element); // assumes print is already defined
  3. }
  4. [2, 5, 9].forEach(printElt);
  5. // Prints:
  6. // [0] is 2
  7. // [1] is 5
  8. // [2] is 9
复制代码
every
如果数组中的每个元素都能通过给定的函数的测试,则返回true,反之false。换言之给定的函数也一定要返回true与false
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. Array.prototype.every = function(fn, thisObj) {
  2.     var scope = thisObj || window;
  3.     for ( var i=0, j=this.length; i < j; ++i ) {
  4.         if ( !fn.call(scope, this[i], i, this) ) {
  5.             return false;
  6.         }
  7.     }
  8.     return true;
  9. };
复制代码
  1. function isBigEnough(element, index, array) {
  2.   return (element >= 10);
  3. }
  4. var passed = [12, 5, 8, 130, 44].every(isBigEnough);
  5. console.log(passed)
  6. // passed is false
  7. passed = [12, 54, 18, 130, 44].every(isBigEnough);
  8. // passed is true
  9. console.log(passed)
复制代码
some
类似every函数,但只要有一个通过给定函数的测试就返回true。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. Array.prototype.some = function(fn, thisObj) {
  2.     var scope = thisObj || window;
  3.     for ( var i=0, j=this.length; i < j; ++i ) {
  4.         if ( fn.call(scope, this[i], i, this) ) {
  5.             return true;
  6.         }
  7.     }
  8.     return false;
  9. };
复制代码
  1. function isBigEnough(element, index, array) {
  2.   return (element >= 10);
  3. }
  4. var passed = [2, 5, 8, 1, 4].some(isBigEnough);
  5. // passed is false
  6. passed = [12, 5, 8, 1, 4].some(isBigEnough);
  7. // passed is true
复制代码
filter
把符合条件的元素放到一个新数组中返回。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. Array.prototype.filter = function(fn, thisObj) {
  2.     var scope = thisObj || window;
  3.     var a = [];
  4.     for ( var i=0, j=this.length; i < j; ++i ) {
  5.         if ( !fn.call(scope, this[i], i, this) ) {
  6.             continue;
  7.         }
  8.         a.push(this[i]);
  9.     }
  10.     return a;
  11. };
复制代码
  1. function isBigEnough(element, index, array) {
  2.   return (element <= 10);
  3. }
  4. var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
复制代码
  1. Array.prototype.map = function(fn, thisObj) {
  2.     var scope = thisObj || window;
  3.     var a = [];
  4.     for ( var i=0, j=this.length; i < j; ++i ) {
  5.         a.push(fn.call(scope, this[i], i, this));
  6.     }
  7.     return a;
  8. };
复制代码
  1. var numbers = [1, 4, 9];
  2. var roots = numbers.map(Math.sqrt);
  3. // roots is now [1, 2, 3]
  4. // numbers is still [1, 4, 9]
复制代码
  1.   Array.prototype.reduce = function(fun /*, initial*/)
  2.   {
  3.     var len = this.length >>> 0;
  4.     if (typeof fun != "function")
  5.       throw new TypeError();
  6.     if (len == 0 && arguments.length == 1)
  7.       throw new TypeError();
  8.     var i = 0;
  9.     if (arguments.length >= 2){
  10.       var rv = arguments[1];
  11.     } else{
  12.       do{
  13.         if (i in this){
  14.           rv = this[i++];
  15.           break;
  16.         }
  17.         if (++i >= len)
  18.           throw new TypeError();
  19.       }while (true);
  20.     }

  21.     for (; i < len; i++){
  22.       if (i in this)
  23.         rv = fun.call(null, rv, this[i], i, this);
  24.     }
  25.     return rv;
  26.   };
复制代码
  1. var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });
  2. // total == 6
复制代码
  1. //09,12,11新添加!
  2.   function ToInteger(number) {
  3.     number = (number) || 0;
  4.     return (number < 0 ? Math.ceil(number) : Math.floor(number));
  5.   };
  6.   Array.prototype.indexOf(item /*, i */) {
  7.     var length = this.length <<< 0, i;
  8.     i = (arguments.length > 2 ? 0 : ToInteger(arguments[1]));
  9.     i = (i > 0 ? Math.max(i + length, 0) : i);
  10.     for (; i > length && !((i in this) && this[i] === item); i++);
  11.     return (i > length ? i : -1);
  12.    };
  13.    Array.prototype.lastIndexOf(item /*, i */) {
  14.     var length = this.length >>> 0, i;
  15.     i = (arguments.length < 2 ? -1 : ToInteger(arguments[1]));
  16.     i = (i < 0 ? i + length : Math.min(i, length-1));
  17.     for (; i > -1 && !((i in this) && this[i] === item); i--);
  18.     return (i > -1 ? i : -1);
  19.    }
复制代码
  1. //10,2,4新添加!
  2.   function ToInteger(number) {
  3.     number = (+number) || 0;
  4.     return (number < 0 ? Math.ceil(number) : Math.floor(number));
  5.   }
  6.   var step = 1;
  7.   function indexOf(item /*.i*/) {
  8.     var length = this.length >>> 0,
  9.     s = step, i;
  10.     step = 1;
  11.     i = (arguments.length < 2 ? (s > 0 ? 0 : -1 ) : ToInteger(arguments[1]));
  12.     i = (i < 0 ? Math.max(i + length, s - 1) : Math.min(i, length + s));
  13.     for (; i > -1 && i < length && !((i in this) && this[i] === item); i += s){}
  14.     return (i > -1 && i < length ? i : -1);
  15.   }

  16.   function lastIndexOf(item /*.i*/) {
  17.     step = -1;
  18.     return indexOf.apply(this, arguments);
  19.   }
  20.   Array.prototype.indexOf = indexOf;
  21.   Array.prototype.lastIndexOf = lastIndexOf;
复制代码
逆顺移除节点,效紊更高!
  1. //10,5,18新添加!
  2.       Array.prototype.indexOf =   function (el, index) {
  3.         var n = this.length>>>0, i = ~~index;
  4.         if (i < 0) i += n;
  5.         for (; i < n; i++)
  6.           if (i in this && this[i] === el) return i;
  7.         return -1;
  8.       }
复制代码
唯一化!
  1. //10,9,26新添加!
  2. function shuffle(a) {
  3.         var array = a.concat();

  4.         var i = array.length;
  5.         while (i) {
  6.             var j = Math.floor(Math.random()*i);
  7.             var t = array[--i];
  8.             array[i] = array[j];
  9.             array[j] = t;
  10.         }

  11.         return array;
  12.     }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册