У меня есть необходимость добавлять или добавлять элементы в начале массива.
Например, если мой массив выглядит следующим образом:
[23, 45, 12, 67]
И ответ на мой вызов AJAX: 34
я хочу, чтобы обновленный массив был таким:
[34, 23, 45, 12, 67]
В настоящее время я планирую сделать это так:
var newArray = [];
newArray.push(response);
for (var i = 0; i < theArray.length; i++) {
newArray.push(theArray[i]);
}
theArray = newArray;
delete newArray;
Есть ли лучший способ сделать это? Есть ли в Javascript какие-либо встроенные функции, которые это делают?
Сложность моего метода в том, O(n)
и было бы очень интересно увидеть лучшие реализации.
javascript
arrays
Луна
источник
источник
push
операторы, сопровождаемые вызовомreverse
, вместо того, чтобы вызыватьunshift
все время.Ответы:
Использование
unshift
. Это какpush
, за исключением того, что он добавляет элементы в начало массива вместо конца.unshift
/push
- добавить элемент в начало / конец массиваshift
/pop
- удалить и вернуть первый / последний элемент массиваПростая схема ...
и диаграмма:
Ознакомьтесь с документацией по массиву MDN . Практически каждый язык, который имеет возможность вставлять / извлекать элементы из массива, также будет иметь возможность отменять / сдвигать (иногда называемые
push_front
/pop_front
) элементы, вам никогда не придется реализовывать их самостоятельно.Как указано в комментариях, если вы хотите избежать мутации вашего исходного массива, вы можете использовать
concat
, который объединяет два или более массивов вместе. Вы можете использовать это, чтобы функционально выдвинуть один элемент в начало или конец существующего массива; для этого вам нужно превратить новый элемент в массив из одного элемента:concat
Можно также добавлять элементы. Аргументыconcat
могут быть любого типа; они неявно заключены в одноэлементный массив, если они еще не являются массивом:источник
concat
может быть предпочтительнее, поскольку оно возвращает новый массив. Очень полезно для цепочки.[thingToInsertToFront].concat(originalArray).reduce(fn).reverse().map(fn)
и т.д ... Если вы используетеunshift
, вы не можете сделать эту цепочку, потому что все, что вы получите, это длина.источник
С ES6 используйте оператор распространения
...
:DEMO
источник
concat
вместо этого.Еще один способ сделать это через
concat
Разница между
concat
и вunshift
том, чтоconcat
возвращает новый массив. Представление между ними можно найти здесь .Вот результат теста
источник
unshift
:: 25 510 ± 3,18% На 99% медленнееconcat
: 2 436 894 ± 3,39% быстрееБыстрый Cheatsheet:
Термины shift / unshift и push / pop могут быть немного запутанными, по крайней мере, для людей, которые могут быть не знакомы с программированием на C.
Если вы не знакомы с жаргоном, вот быстрый перевод альтернативных терминов, который может быть легче запомнить:
источник
у вас есть массив:
var arr = [23, 45, 12, 67];
Чтобы добавить элемент в начало, вы хотите использовать
splice
:источник
unshift
50% быстрее (но в основном более читабельно)Без мутирования
На самом деле, все
unshift
/push
иshift
/pop
мутировать массив.unshift
/push
Добавить элемент к существовавшему массиву из начала / конца иshift
/pop
удалить элемент из начала / конца массива.Но есть несколько способов добавить элементы в массив без мутации. В результате получается новый массив, для добавления в конец массива используйте следующий код:
Для добавления в начало оригинального массива используйте код ниже:
Вышеописанным способом вы добавляете в начало / конец массива без мутации.
источник
slice
функцию в конце,originArray
чтобы предотвратить ее изменчивость.Использование ES6 деструктуризации: (избегая мутации из исходного массива)
const newArr = [item, ...oldArr]
источник
Если вам нужно постоянно вставлять элемент в начале массива, быстрее использовать
push
операторы с последующим вызовомreverse
вместо того, чтобы вызыватьunshift
все время.Контрольный тест: http://jsben.ch/kLIYf
источник
Используя,
splice
мы вставляем элемент в массив в начале:источник