Ci sono alcune risposte veramente creative a questa domanda qui. Ecco una soluzione semplice per coloro che hanno appena iniziato con gli array. Se lo si desidera, può essere fatto funzionare fino ai browser compatibili con ECMAScript 3.
Impara qualcosa sulla giunzione prima di iniziare.
Rete di sviluppatori Mozilla: Array.prototype.splice ()
Innanzitutto, comprendi due importanti forme di .splice()
.
let a1 = [1,2,3,4],
a2 = [1,2];
Metodo 1) Rimuovere gli elementi x (deleteCount), a partire da un indice desiderato.
let startIndex = 0,
deleteCount = 2;
a1.splice(startIndex, deleteCount);
Metodo 2) Rimuovere gli elementi dopo un indice iniziale desiderato fino alla fine della matrice.
a1.splice(2);
Utilizzando .splice()
, un obiettivo potrebbe essere quello di dividerea1
in array di testa e coda utilizzando una delle due forme sopra.
Utilizzando il metodo n. 1, il valore restituito diventerebbe la testa e a1
la coda.
let head = a1.splice(startIndex, deleteCount);
Ora, in un colpo solo, concatena la testa, il corpo ( a2
) e la coda
[].concat(head, a2, a1);
Pertanto, questa soluzione è più simile al mondo reale di qualsiasi altra presentata finora. Non è quello che faresti con i Lego? ;-) Ecco una funzione, eseguita utilizzando il metodo # 2.
function insertArray(target, body, startIndex)
{
let tail = target.splice(startIndex);
return [].concat(target, body, tail);
}
let newArray = insertArray([1, 2, 3, 4], ["a", "b"], 2);
Più breve:
function insertArray(target, body, startIndex)
{
return [].concat(target, body, target.splice(startIndex));
}
Più sicuro:
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));
}
I vantaggi di questa soluzione includono:
1) Una semplice premessa domina la soluzione: riempire un array vuoto.
2) La nomenclatura di testa, corpo e coda sembra naturale.
3) Nessuna doppia chiamata a .slice()
. Niente affettatura.
4) No .apply()
. Altamente inutile.
5) Si evita il concatenamento dei metodi.
6) Funziona in ECMAScript 3 e 5 semplicemente usando al var
posto di let
oconst
.
** 7) Assicura che ci saranno una testa e una coda da schiaffeggiare sul corpo, a differenza di molte altre soluzioni presentate. Se stai aggiungendo un array prima o dopo i limiti, dovresti almeno usare.concat()
!!!!
Nota: l'uso dello spread opearator ...
rende tutto questo molto più facile da realizzare.