Этот первый самый подходящий. Повторение одного уровня для каждого элемента массива может иметь смысл на функциональном языке, но на процедурном языке без оптимизации хвостового вызова это безумие.
Однако на Array
уже есть функция map
: она определена в пятом издании ECMA-262 и, как встроенная функция, будет оптимальным выбором. Используйте это:
alert([1,2,3].map(function(n) { return n+3; })); // 4,5,6
Единственная проблема заключается в том, что пятое издание поддерживается не всеми современными браузерами: в частности, расширения Array отсутствуют в IE. Но вы можете исправить это, немного поработав над прототипом Array:
if (!Array.prototype.map) {
Array.prototype.map= function(fn, that) {
var result= new Array(this.length);
for (var i= 0; i<this.length; i++)
if (i in this)
result[i]= fn.call(that, this[i], i, this);
return result;
};
}
Эта версия, в соответствии со стандартом ECMA, позволяет передавать необязательный объект для привязки к this
в вызове функции и пропускает все пропущенные значения (в JavaScript допустимо иметь список длины 3, где второго пункта нет).