Qual é a maneira mais eficiente de inserir um array dentro de outro array.
a1 = [1,2,3,4,5];
a2 = [21,22];
newArray - a1.insertAt(2,a2) -> [1,2, 21,22, 3,4,5];
Iterar a2 usando splice parece um pouco horrível do ponto de vista do desempenho se o array a2 for grande.
Obrigado.
Respostas:
Você pode usar
splice
combinado com algunsapply
truques:No ES2015 +, você poderia usar o operador spread em vez de tornar isso um pouco mais agradável
fonte
apply
, uma exceção stackoverflow será lançada . jsfiddle.net/DcHCY Também acontece no jsPerf Eu acredito no FF e no IE o limite é em torno de 500ktarget.slice(0, insertIndex).concat(insertArr, target.slice(insertIndex));
jsperf.com/inserting-an-array-within-an-arrayAgora você pode fazer isso se estiver usando o ES2015 ou posterior:
Consulte a documentação sobre o operador de propagação (...) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
fonte
Estava errado no começo. Deveria ter usado em seu
concat()
lugar.Exemplo: http://jsfiddle.net/f3cae/1/
Esta expressão usa
slice(0, 2)
[docs] para retornar os dois primeiros elementos dea1
(onde0
é o índice inicial e2
é o elemento deleteCount, emboraa1
não seja alterado).Resultado intermediário :
[1,2]
Em seguida, usa
concat(a2)
[docs] para anexara2
ao final do[1,2]
.Resultado intermediário :
[1,2,21,22]
.Em seguida,
a1.slice(2)
é chamado dentro de um final.concat()
da cauda desta expressão, que equivale a[1,2,21,22].concat(a1.slice(2))
.Uma chamada para
slice(2)
, tendo um argumento inteiro positivo, retornará todos os elementos após o segundo elemento, contando por números naturais (como em, há cinco elementos, então[3,4,5]
será retornado dea1
). Outra maneira de dizer isso é que o argumento do índice de número inteiro singular informaa1.slice()
em qual posição na matriz começar a retornar os elementos (o índice 2 é o terceiro elemento).Resultado intermediário :
[1,2,21,22].concat([3,4,5])
Finalmente, o segundo
.concat()
adiciona[3,4,5]
ao final de[1,2,21,22]
.Resultado :
[1,2,21,22,3,4,5]
Pode ser tentador alterar
Array.prototype
, mas pode-se simplesmente estender o objeto Array usando a herança prototípica e injetar esse novo objeto em seus projetos.No entanto, para aqueles que vivem no limite ...
Exemplo: http://jsfiddle.net/f3cae/2/
fonte
O operador de propagação permite que uma expressão seja expandida em locais onde vários argumentos (para chamadas de função) ou vários elementos (para literais de matriz) são esperados.
fonte
Existem algumas respostas verdadeiramente criativas para esta pergunta aqui. Aqui está uma solução simples para quem está começando com arrays. Ele pode ser feito para funcionar em navegadores compatíveis com ECMAScript 3, se desejado.
Saiba algo sobre emenda antes de começar.
Rede de desenvolvedores Mozilla: Array.prototype.splice ()
Primeiro, compreenda duas formas importantes de
.splice()
.Método 1) Remova os elementos x (deleteCount), começando com um índice desejado.
Método 2) Remova os elementos após um índice inicial desejado até o final da matriz.
Usando
.splice()
, um objetivo poderia ser dividira1
em matrizes inicial e final usando uma das duas formas acima.Usando o método nº 1, o valor de retorno se tornaria a cabeça e
a1
a cauda.Agora, de uma só vez, concatene a cabeça, o corpo (
a2
) e a caudaPortanto, essa solução é mais parecida com o mundo real do que qualquer outra apresentada até agora. Não é isso que você faria com Legos? ;-) Aqui está uma função, feita usando o método # 2.
Mais curta:
Mais seguro:
As vantagens desta solução incluem:
1) Uma premissa simples domina a solução - preencha uma matriz vazia.
2) A nomenclatura da cabeça, corpo e cauda parece natural.
3) Nenhuma chamada dupla para
.slice()
. Sem fatiar.4) Não
.apply()
. Altamente desnecessário.5) O encadeamento de métodos é evitado.
6) Funciona no ECMAScript 3 e 5 simplesmente usando em
var
vez delet
ouconst
.** 7) Garante que haverá cabeça e cauda para dar um tapa no corpo, ao contrário de muitas outras soluções apresentadas. Se você estiver adicionando um array antes ou depois dos limites, deve pelo menos usar
.concat()
!!!!Nota: O uso do opearador de propagação
...
torna tudo isso muito mais fácil de realizar.fonte
Eu queria encontrar uma maneira de fazer isso com
splice()
e sem iteração: http://jsfiddle.net/jfriend00/W9n27/ .Na forma de função de uso geral:
fonte
a2
matriz também, o que provavelmente é bastante indesejável. Além disso, você não precisa ir para oArray.prototype
quando tiver a função de fatia bem ali noa1
oua2
.apply()
método.Array.prototype.splice
vsa1.splice
:).concat
retorna um novo array, ele não modifica o existente comosplice
. Deveria serargs = args.concat(arrayToInsert);
fonte
Esta é minha versão sem truques especiais:
fonte
.apply()
.Se você deseja inserir outro array em um array sem criar um novo, a maneira mais fácil é usar
push
ouunshift
comapply
Por exemplo:
Isso funciona porque ambos
push
eunshift
recebem um número variável de argumentos. Um bônus, você pode escolher facilmente em qual extremidade anexar a matriz!fonte
a1.concat(a2)
oua2.concat(a1)
, criei algo mais fácil do que o que você sugere. No entanto, o problema é inserir uma matriz entre os limites da matriz, não exclusivamente adicionar uma matriz ao início ou ao fim. ;-)Conforme mencionado em outro tópico, as respostas acima não funcionarão em matrizes muito grandes (200 mil elementos). Veja a resposta alternativa aqui envolvendo emenda e envio manual: https://stackoverflow.com/a/41465578/1038326
fonte