Eu preciso adicionar ou adicionar elementos no início de uma matriz.
Por exemplo, se minha matriz se parecer com abaixo:
[23, 45, 12, 67]
E a resposta da minha chamada AJAX é que 34
eu quero que a matriz atualizada seja a seguinte:
[34, 23, 45, 12, 67]
Atualmente, estou planejando fazer assim:
var newArray = [];
newArray.push(response);
for (var i = 0; i < theArray.length; i++) {
newArray.push(theArray[i]);
}
theArray = newArray;
delete newArray;
Existe alguma maneira melhor de fazer isso? O Javascript tem alguma funcionalidade interna que faz isso?
A complexidade do meu método é O(n)
e seria realmente interessante ver melhores implementações.
javascript
arrays
Lua
fonte
fonte
push
instruções seguidas por uma chamada parareverse
, em vez de chamarunshift
o tempo todo.Respostas:
Use
unshift
. É comopush
, exceto que ele adiciona elementos ao início da matriz em vez do final.unshift
/push
- adiciona um elemento ao início / fim de uma matrizshift
/pop
- remove e retorna o primeiro / último elemento de uma matrizUm diagrama simples ...
e gráfico:
Confira a documentação da matriz MDN . Praticamente todas as linguagens que têm a capacidade de empurrar / pop elementos de uma matriz também têm a capacidade de desviar / mudar (às vezes chamado
push_front
/pop_front
) elementos, você nunca precisará implementá-los.Conforme apontado nos comentários, se você deseja evitar a mutação de sua matriz original, pode usar
concat
, que concatena duas ou mais matrizes juntas. Você pode usar isso para empurrar funcionalmente um único elemento para a frente ou para trás de uma matriz existente; para fazer isso, você precisa transformar o novo elemento em uma única matriz de elementos:concat
também pode acrescentar itens. Os argumentos paraconcat
podem ser de qualquer tipo; eles estão implicitamente agrupados em uma matriz de elemento único, se ainda não forem uma matriz:fonte
concat
pode ser preferível, pois retorna a nova matriz. Muito útil para encadeamento.[thingToInsertToFront].concat(originalArray).reduce(fn).reverse().map(fn)
etc ... Se você usaunshift
, não pode fazer esse encadeamento porque tudo o que você recebe é o comprimento.fonte
Com o ES6, use o operador spread
...
:DEMO
fonte
concat
.Outra maneira de fazer isso através
concat
A diferença entre
concat
eunshift
é queconcat
retorna uma nova matriz. O desempenho entre eles pode ser encontrado aqui .Aqui está o resultado do teste
fonte
unshift
: 25510 ± 3,18% a 99% mais lentoconcat
: 2436894 ± 3,39% mais rápidoFolha de dicas rápida:
Os termos shift / unshift e push / pop podem ser um pouco confusos, pelo menos para as pessoas que podem não estar familiarizadas com a programação em C.
Se você não conhece o jargão, aqui está uma tradução rápida de termos alternativos, que podem ser mais fáceis de lembrar:
fonte
você tem uma matriz:
var arr = [23, 45, 12, 67];
Para adicionar um item ao começo, você deseja usar
splice
:fonte
unshift
50% mais rápido (mas principalmente mais legível)Sem mutação
Na verdade, todos
unshift
/push
eshift
/pop
modificam a matriz de origem.O
unshift
/push
adiciona um item à matriz existente a partir do início / fim eshift
/pop
remove um item do início / fim de uma matriz.Mas existem poucas maneiras de adicionar itens a uma matriz sem uma mutação. o resultado é uma nova matriz, para adicionar ao final da matriz, use o código abaixo:
Para adicionar ao início da matriz original, use o código abaixo:
Com a maneira acima, você adiciona ao início / fim de uma matriz sem uma mutação.
fonte
slice
função no final deoriginArray
para impedi-la de mutabilidade.Usando a desestruturação do ES6: (evitando a mutação da matriz original)
const newArr = [item, ...oldArr]
fonte
fonte
Se você precisar inserir continuamente um elemento no início de uma matriz, é mais rápido usar
push
instruções seguidas por uma chamada parareverse
, em vez de chamarunshift
o tempo todo.Teste de benchmark: http://jsben.ch/kLIYf
fonte
Usando
splice
nós inserimos um elemento em uma matriz no início:fonte