簡體   English   中英

如何為稀疏數組實現Javascript ECMA 5的array.map()?

[英]How to implement Javascript ECMA 5's array.map() for sparse array?

實現在ECMA-262中定義的 array.map()應該很容易,它接受一個函數,這個函數將被3個參數調用:元素值,索引,數組。

但是對於稀疏數組呢? 顯然,如果只有索引0,1,2和100,000具有一個元素,並且從索引3到99,999稀疏,我們不希望從索引0迭代到100,000。 我可以考慮使用arr.slice(0)arr.concat()來克隆數組,然后輸入替換的值,但是如果我們不使用sliceconcat ,還有另一種方法嗎?

我用slice()提出的解決方案是:

Array.prototype.collect = Array.prototype.collect || function(fn) {
    var result = this.slice(0);

    for (var i in this) {
      if (this.hasOwnProperty(i))
        result[i] = fn(this[i], i, this);  // 3 arguments according to ECMA specs
    }
    return result;
};

collect用於試用代碼,因為這是某種語言的map的另一個名稱)

它應該很容易,但有一些特殊的要點。

允許回調函數修改有問題的數組。 不會訪問它添加或刪除的任何元素。 所以我們似乎應該使用像Object.keys這樣的東西來確定要訪問的元素。

此外,結果被定義為一個新的數組“按照數組構造函數創建的”,它采用舊數組的長度,因此我們不妨使用該構造函數來創建它。

這是考慮到這些因素的實現,但可能缺少其他一些細微之處:

function map(callbackfn, thisArg) {
  var keys = Object.keys(this),
    result = new Array(this.length);

  keys.forEach(function(key) {
    if (key >= 0 && this.hasOwnProperty(key)) {
      result[key] = callbackfn.call(thisArg, this[key], key, this);
    }
  }, this);

  return result;
}

我假設Object.keys按數字順序返回數組的鍵,我認為是實現定義。 如果沒有,你可以對它們進行排序。

您不需要使用this.slice(0) 您只需將result作為數組並將值分配給任何索引:

Array.prototype.collect = Array.prototype.collect || function(fn) { 
  var result = [];
  for(var i in this) {
    if (this.hasOwnProperty(i)) { 
      result[i] = fn(this[i]);
    }
  }
  return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM