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()
.
let a1 = [1,2,3,4],
a2 = [1,2];
Método 1) Remova os elementos x (deleteCount), começando com um índice desejado.
let startIndex = 0,
deleteCount = 2;
a1.splice(startIndex, deleteCount); // returns [1,2], a1 would be [3,4]
Método 2) Remova os elementos após um índice inicial desejado até o final da matriz.
a1.splice(2); // returns [3,4], a1 would be [1,2]
Usando .splice()
, um objetivo poderia ser dividir a1
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.
let head = a1.splice(startIndex, deleteCount); // returns [1,2], a1 would be [3,4]
Agora, de uma só vez, concatene a cabeça, o corpo ( a2
) e a cauda
[].concat(head, a2, a1);
Portanto, 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.
/**
*@param target Array The array to be split up into a head and tail.
*@param body Array The array to be inserted between the head and tail.
*@param startIndex Integer Where to split the target array.
*/
function insertArray(target, body, startIndex)
{
let tail = target.splice(startIndex); // target is now [1,2] and the head
return [].concat(target, body, tail);
}
let newArray = insertArray([1, 2, 3, 4], ["a", "b"], 2); // [1, 2, "a", "b", 3, 4]
Mais curta:
/**
*@param target Array The array to be split up into a head and tail.
*@param body Array The array to be inserted between the head and tail.
*@param startIndex Integer Where to split the target array.
*/
function insertArray(target, body, startIndex)
{
return [].concat(target, body, target.splice(startIndex));
}
Mais seguro:
/**
*@param target Array The array to be split up into a head and tail.
*@param body Array The array to be inserted between the head and tail.
*@param startIndex Integer Where to split the target array.
*@throws Error The value for startIndex must fall between the first and last index, exclusive.
*/
function insertArray(target, body, startIndex)
{
const ARRAY_START = 0,
ARRAY_END = target.length - 1,
ARRAY_NEG_END = -1,
START_INDEX_MAGNITUDE = Math.abs(startIndex);
if (startIndex === ARRAY_START) {
throw new Error("The value for startIndex cannot be zero (0).");
}
if (startIndex === ARRAY_END || startIndex === ARRAY_NEG_END) {
throw new Error("The startIndex cannot be equal to the last index in target, or -1.");
}
if (START_INDEX_MAGNITUDE >= ARRAY_END) {
throw new Error("The absolute value of startIndex must be less than the last index.");
}
return [].concat(target, body, target.splice(startIndex));
}
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 de let
ou const
.
** 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.