Я не уверен, что это более эффективно с точки зрения большого О, но, конечно, использование метода unshift
более кратко:
var a = [1, 2, 3, 4];
a.unshift(0);
a; // => [0, 1, 2, 3, 4]
[Изменить]
Этот тест jsPerf показывает, что unshift
работает значительно быстрее по крайней мере в нескольких браузерах, независимо от возможно, другая производительность big-O если вы согласны с изменением массива на месте. Если вы действительно не можете изменить исходный массив, вы должны сделать что-то вроде приведенного ниже фрагмента, который, похоже, не намного быстрее, чем ваше решение:
a.slice().unshift(0); // Use "slice" to avoid mutating "a".
[Изменить 2]
Для полноты картины вместо примера OP prependArray(...)
можно использовать следующую функцию, чтобы воспользоваться преимуществом метода Array unshift(...)
:
function prepend(value, array) {
var newArray = array.slice();
newArray.unshift(value);
return newArray;
}
var x = [1, 2, 3];
var y = prepend(0, x);
y; // => [0, 1, 2, 3];
x; // => [1, 2, 3];
01.06.2011
unshift
по-прежнему O (N) из-за хранения массивов. Но да, это было бы намного эффективнее петли. 01.06.2011prepend
unshift
? 08.08.2013unshift
звучит более подходящим для такой операции с массивом (он перемещает элементы ... более или менее физически).prepend
было бы более подходящим для связанных списков, где вы буквально добавляете элементы. 22.08.2013unshift
. И поэтомуa.slice(0).unshift(0)
не имеет смысла. Исправлено в ответе. 09.11.2015push
иunshift
оба содержатu
, тогда какpop
иshift
не содержат. 07.04.2016src.slice(0)
копировать 1src.unshift(value)
копировать каждый элемент более чем на 1 слот. самый эффективный способ добавить в начало без изменения оригинала - скопировать за 1 проход, напримерvar dest = new Array(src.length + 1); for(var i = 0; src.length > i; i++) dest[i+1] = src[i]
04.03.2017