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