36 Array

Gli array sono dei contenitori, come le variabili, ma che possono contenere più valori, a differenza della variabile che contiene un valore solo. Il numero di elementi di un array non è prefissato.
Ci sono tre forme per istanziare un array in js:

let vuoto1 = new Array();
let vuoto2 = Array();
let vuoto3 = [];

La forma più snella, almeno visivamente è l’ultima, chiamata array literali, costituita dal nome, uguale, parentesi quadra aperta, parentesi quadra chiusa. Questa forma comunica nell’immediato che si tratta di un array vuoto grazie alle quadre [].

Le prime due forme hanno un sintassi legata alla chiamata di una funzione costruttore di array e possono creare ambiguità visiva in alcuni contesti,:

function Array() {
   return false;
}

let giorni = new Array();
console.log(giorni.lenght);

Riceverei nella console un undefined, mentre con i literal array (quelli con le parentesi quadre) potrei usufruire di lenght che mi restituisce la lunghezza.  Inoltre le quadre sono tipiche dell’array e non rischiano di creare confusione.

Ecco un esempio di array non vuoti con le prime due forme:

let v1 = Array(100);    //100 elementi pre allocati 
let v2 = Array('100');  //1 elemento stringa
let v3 = new Array(31,8,2017); //3 elementi

Come si vede, queste forme possono generare confusione, mentre ecco com’è l’istanza di un array con il valore 5 nella terza forma:

let v4 = [5]; //un elemento === 5, senza sorprese

In js gli array possono contenere elementi di tipo diverso:

let arr2 = Array(31, "Agosto", 2017);

numeri e stringhe, vediamolo con la terza forma

let arr3 = [31, 8, 2017];        //secondo me la più chiara

forEach

Gli array hanno un metodo dedicato che permette di ciclare il loro contenuto, il forEach. Ecco una funzione per la stampa degli array

function stampaArray(arr)
{
  //un parametro, la soluzione migliore per quello che dobbiamo fare
  arr.forEach( function(elemento)  { writeln( elemento ); } );
}

Dovremmo essere in grado di riconoscere la funzione anonima e la closure della funzione writeln che riceve il parametro elemento. La funzione anonima riceve il parametro dal metodo forEach che sarà il primo elemento dell’array arr.

Ogni elemento di un array occupa un posto, chiamato indice. Il conteggio degli indici parte dalla posizione zero [0] in avanti.

Volendo si potrebbe aggiungere un secondo parametro che indica l’indice

arr.forEach( function(elemento, indice)  { writeln( indice + ":" + arr[indice] ); } );

E addirittura un terzo parametro che è l’array stesso, con una forma perfezionistica, ma masochistica

arr.forEach( function(elemento, indice, a)  { writeln( indice + ":" + a[indice] ); } );

Per il nostro esempio la prima forma è preferibile oltre che maggiormente adatta al nostro scopo.

Alla fine dopo la dichiarazione dell’array visto prima lo stampo con la ovvieristica funzione creata:

let arr2 = Array(31, "Agosto", 2017);
let arr3 = [31, 8, 2017];        //secondo me la più chiara 

// stampaArray(arr2);
// stampaArray(arr3);

Aggiungere, togliere elementi

Con il metodo push aggiungo un nuovo elemento in fondo all’array

arr2.push("ciao");

In questo caso ho aggiunto la stringa ciao in fondo all’array arr2.

Posso aggiungere anche più valori anche di tipo diverso:

arr2.push("questo", 4 , "e quello");

ecco una versione migliorata della funzione writeln

function writeln(messaggio, cornicetta=false) 
{
   document.write(messaggio+"<br>");
   if (cornicetta)
     writeln("-".repeat(40));
}

aggiunto il secondo parametro cornicetta settato di default a false per non rende obbligatoria la sua dichiarazione. Se è dettato il valore del parametro cornicetta, stampo un meno 40 volte grazie alla funzione interna repeat().

Ecco il push che aggiunge ciao in fondo all’array con la nuova versione della  funzione writeln()

arr2.push("ciao"); //aggiunge "ciao" in fondo all'array
writeln(arr2, true); //true=stampa riga di trattini -------------

Di seguito invece la funzione pop che serve a togliere elementi ad un array, partendo dal fondo

arr2.pop(); //elimina l'ultimo elemento
writeln(arr2, true);

Un esempio di aggiunta col push nella forma snella, specificando l’indice nel quale inserire il valore

arr2[3]="ciao"; //stesso effetto di push (in questa situazione)
writeln(arr2, true);

In questo caso la avevamo 3 valori dentro l’array arr2 che occupano le posizioni 0, 1, 2 il quarto valore sarà in terza posizione quindi quest’ultimo push è identico al primo. Se avessimo avuto più elementi , invece, questo push mi avrebbe modificato il valore del quart elemento (quello con indice 3)

In maniera analoga al push, esiste il metodo shift che aggiunge elementi all’inizio dell’array.