Gli array forniscono una gran quantità di metodi. Per rendere le cose più semplici, in questo capitolo li abbiamo divisi per gruppi.
Aggiungere/rimuovere elementi
Conosciamo già i metodi che consentono di aggiungere e rimuovere elementi:
arr.push(...items)– aggiunge un elemento in coda,arr.pop()– estrae un elemento dalla coda,arr.shift()– estrae un elemento dalla testa,arr.unshift(...items)– aggiunge un elemento in testa.
Vediamone altri.
splice
Come cancellare un elemento dall’array?
Gli array sono oggetti, quindi possiamo provare ad utilizzare delete:
let arr = ["I", "go", "home"];
delete arr[1]; // rimuove "go"
alert( arr[1] ); // undefined
// ora arr = ["I", , "home"];
alert( arr.length ); // 3
L’elemento viene rimosso, ma l’array ha ancora 3 elementi, possiamo vederlo tramite arr.length == 3.
Non è una sorpresa, perché delete obj.key rimuove un valore dalla key. Questo è tutto quello che fa. Può andare bene per gli oggetti. Con gli array vorremmo che il resto degli elementi scalassero, andando ad occupare il posto che si è liberato. Per questo ci aspetteremmo di avere un array più corto.
Per questo scopo sono stati sviluppati dei metodi dedicati.
Il metodo arr.splice è un coltellino svizzero per array. Può fare qualsiasi cosa: aggiungere e rimuovere elementi, ovunque.
La sintassi è:
arr.splice(start[, deleteCount, elem1, ..., elemN])
Modifica l’array partendo dall’indice start; rimuove deleteCount elementi ed inserisce elem1, ..., elemN. Infine ritorna un array contenente gli elementi rimossi.
Questo metodo è facile da capire tramite esempi.
Proviamo ad eliminare degli elementi:
let arr = ["I", "study", "JavaScript"];
arr.splice(1, 1); // a partire da indice 1 rimuove 1 elemento
alert( arr ); // ["I", "JavaScript"]
Facile, vero? Ha rimosso 1 elemento, a partire dall’elemento 1.
Nel prossimo esempio, rimuoviamo 3 elementi e li rimpiazziamo con altri due:
let arr = ["I", "study", "JavaScript", "right", "now"];
// rimuove i primi 3 elementi e li rimpiazza con altri
arr.splice(0, 3, "Let's", "dance");
alert( arr ) // ora ["Let's", "dance", "right", "now"]
Possiamo vedere l’array ritornato da splice contenente gli elementi rimossi:
let arr = ["I", "study", "JavaScript", "right", "now"];
// rimuove i primi 2 elementi
let removed = arr.splice(0, 2);
alert( removed ); // "I", "study" <-- array di elementi rimossi
Il metodo splice è anche in grado di inserire elementi senza alcuna rimozione. Per ottenere questo dobbiamo impostare deleteCount a 0:
let arr = ["I", "study", "JavaScript"];
// da indice 2
// ne rimuove 0
// poi inserisce "complex" e "language"
arr.splice(2, 0, "complex", "language");
alert( arr ); // "I", "study", "complex", "language", "JavaScript"
In questo come in altri metodi dedicati agli array, sono permessi indici negativi. Essi specificano la posizione dalla fine dell’array, come:
let arr = [1, 2, 5];
// dall'indice -1 (un passo dalla fine)
// cancella 0 elementi,
// poi inserisce 3 e 4
arr.splice(-1, 0, 3, 4);
alert( arr ); // 1,2,3,4,5
slice
Il metodo arr.slice è più semplice di arr.splice.
La sintassi è:
arr.slice([start], [end])
Ritorna un nuovo array contente tutti gli elementi a partire da "start" fino ad "end" ("end" escluso). Sia start che end possono essere negativi; in tal caso si inizierà a contare dalla coda dell’array.
Funziona come str.slice, ma crea dei sotto-array piuttosto che sotto-stringhe.
Ad esempio:
let arr = ["t", "e", "s", "t"];
alert( arr.slice(1, 3) ); // e,s (copia da 1 a 3)
alert( arr.slice(-2) ); // s,t (copia da -2 fino alla fine)
Possiamo anche utilizzarlo senza argomenti: arr.slice() crea una copia di arr. Questo tipo di chiamata è spesso utilizzata per creare una copia con cui poter liberamente lavorare senza modificare l’array originale.
concat
Il metodo arr.concat crea un nuovo array che include valori di altri array, o elementi aggiuntivi.
La sintassi è:
arr.concat(arg1, arg2...)
Accetta un numero arbitrario di argomenti – sia array che valori.
Il risultato è un nuovo array contenente gli elementi di arr, seguiti da arg1, arg2 etc.
Se un argomento argN è un array, tutti i suoi elementi vengono copiati. Altrimenti viene copiato solamente l’argomento stesso.
Un esempio:
let arr = [1, 2];
// unisce arr con [3,4]
alert( arr.concat([3, 4])); // 1,2,3,4
// unisce arr con [3,4] e [5,6]
alert( arr.concat([3, 4], [5, 6])); // 1,2,3,4,5,6
// unisce arr con [3,4], poi aggiunge i valori 5 e 6
alert( arr.concat([3, 4], 5, 6)); // 1,2,3,4,5,6
Normalmente copia elementi da un array. Gli altri oggetti, anche se assomigliano molto ad un array, vengono aggiunti interamente: