Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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[i] === item) 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方法差不多。

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

//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[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
//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[1]));
    i = (i > 0 ? Math.max(i + length, 0) : i);
    for (; i > length && !((i in this) && this[i] === 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[1]));
    i = (i < 0 ? i + length : Math.min(i, length-1));
    for (; i > -1 && !((i in this) && this[i] === 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[1]));
    i = (i < 0 ? Math.max(i + length, s - 1) : Math.min(i, length + s));
    for (; i > -1 && i < length && !((i in this) && this[i] === 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[i] === 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[i] = array[j];
            array[j] = t;
        }
 
        return array;
    }
// 11.7.5 http://cmc3.cn/n/84.html
 Array.prototype.remove = function(s) {  
     for (var i =  this.length; i >=0;i--) {  
          if (s === this[i])    this.splice(i, 1);  
     }  
         return this;
 

逆顺移除节点,效紊更高!

var arr = ["aaa","bbb","ccc","ddd"],reg = /aaa|ddd/
for (var i =  arr.length, el; el = arr[--i]; ) {
  console.log(el)
  if(reg.test(el)){
    arr.splice(i, 1);
  }
}
console.log(arr)

唯一化!

//2011.8.29
    var unique = function(array) {
        var ret = [];
        o:for(var i = 0, n = array.length; i < n; i++) {
            for(var x = i + 1 ; x < n; x++) {
                if(array[x] === array[i])
                    continue o;
            }
            ret.push(array[i]);
        }
        return ret;
    }
 
function uniq(array){
    var ret = [],ri = 0
    array = array.sort();
    ret[ri] = array[0];
     
    for(var j = 1, n = array.length; j < n; j++){
        if(ret[ri] !== array[j]){
            ret[++ri] = array[j]
        }
    }
    return ret;
}
uniq([1,2,2,"a","b","a",{},function(){},null,void 0,null,3,2,void 0,{}])

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(5698)  评论(15编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示