[英]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()
來克隆數組,然后輸入替換的值,但是如果我們不使用slice
或concat
,還有另一種方法嗎?
我用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.