38 array 3
Proseguendo con gli array, iniziamo subito con il metodo fill che serve a sostituire i valori degli elementi compresi in un range di indici con uno specificato come primo parametro
resti.fill(0,0,10); writeln(resti);
Sostituisco il valore zero (prima parametro) agli elementi compresi tra l’indice zero e dieci ESCLUSO (secondo e terzo parametro). In questo esempio stiamo azzerando i primi dieci elementi (dalla posizione 0 alla 9). Se non si specifica l’ultimo parametro, verranno sostituiti tutti gli elementi dal secondo parametro fino in fondo, mentre se non si specifica il secondo saranno sostituiti tutti gli elementi dell’array.
Vediamo un nuovo caso che ci permette di filtrare da un array gli elementi diversi da zero, tramite il metodo filter.
let diversiDaZero = resti.filter( elemento => elemento!==0 ); writeln(diversiDaZero);
Il metodo filter si aspetta come parametro una funzione, usiamo come visto nella precedente lezione l’uso delle funzioni freccia. Ricordo che elemento non è il nome della funzione, ma il parametro che verrà filtrato se la condizione restituisce TRUE, quindi tutti gli elementi diversi da zero (elemento!==0). Come per map già visto possiamo indicare anche l’indice e l’array come parametri (elemento,indice, a).
Analogamente si usa il metodo some che restituisce solo il primo elemento trovato
if ( diversiDaZero.some( elemento => elemento>4 ) ) {writeln("Trovato almento un resto maggiore di zero");}
Mi interessa vedere se nell’array esiste ALMENO un elemento che supera il valore quattro.
Adesso perchè non farli contare quanti sono questi elementi dell’array? Ecco il metodo reduce che necessita di un suo parametro che ha la funzione di contatore che abbiamo chiamato conta
let quanti = diversiDaZero.reduce( (conta, elemento) => elemento>4 ? conta + 1 : conta, 0); writeln(quanti);
In questo caso il metodo riceve 2 parametri, una è la funzione freccia che abbiamo indicato con un’espressione condizionale:
(conta, elemento) => elemento>4 ? conta + 1 : conta
Il secondo parametro indica il valore di partenza dell’indice (conta) che nel nostro caso vale zero.
Supponendo che la variabile diversiDaZero abbia i seguenti elementi:
3,4,3,3,5,3,2,5,1,4,5,6,4,6,5,1,4
l’espressione partirà con conta che vale zero, elemento vale 3 (primo elemento), per cui non viene soddisfatta la condizione 3 > 4 saltando l’incremento e restituendo il valore di conta (cioè 0).
Il secondo elemento vale 4, 4 non è maggiore di 4, conta vale sempre 0.
Terzo e quarto elemento è 3 , 3 non è maggiore di 4, conta = 0.
Quinto elemento è 5, 5 è maggiore di zero (TRUE), parte l’incremento conta + 1 , il valore di conta adesso è 1.
Il risultato finale nel nostro array è 6, ovvero ci sono 6 valori maggiori di 4.
Particolarità: il secondo parametro (valore iniziale dell’indice conta), non è obbligatorio, qualora non venga specificato, il valore di conte parte con il valore del primo elemento che nel nostro caso è 3, dando un risultato che potrebbe essere inatteso (nel nostro caso 9 (6+3) ). Un caso pratico per cui potrebbe essere utile partire col valore del primo elemento, potrebbe essere che voglio la somma di tutti gli elementi numerici di un array, in questo caso è utile avere come valore dell’indice il valore del primo elemento, ecco il codice:
let totale = diversiDaZero.reduce( (somma, elemento) => somma+elemento); writeln(totale);
somma è inizializzato col valore 3 (sempre tenendo presente i numeri generati sopra come esempio), elemento riceve il secondo valore che è 4, somma+elemnto fa 7 , elemento riceve il terzo valore che è 3, somma =19, il quarto 3, somma vale 13…. alla fine il risultato totale è 54, la somma di tutti gli elementi.
Per unire 2 array in uno nuovo si usa il metodo concat:
arr3 = arr2.concat(resti);
Complementare al some è every, che restituisce TRUE quando TUTTI gli elementi soddisfano un criterio specificato, ecco un esempio, se tutti gli elementi sono maggiori di 4 every restituisce TRUE:
if ( diversiDaZero.every( elemento => elemento>4 ) ) {writeln("tutti maggiori di 4");}
Per trasformare in stringa un array, cioè prendere ciascun elemento e concatenarlo e metterlo in una stringa usare join:
let stringa = arr3.join(); writeln(stringa);
Invertire l’ordine degli elementi col metodo reverse, l’ultimo diventa il primo, il penultimo il secondo e così via
writeln(arr3.reverse());
Per ordinare gli elementi troviamo il metodo sort, che trasforma i valori in stringa e li riordina in alfabetico, quindi lo 0 vale a, 1 b. 2 c… , il 10 viene trasformato in 2 lettere ( ba ), quindi viene ordinato prima del 2 (ba viene prima di c),. La parola Agosto, iniziando con la A maiuscola equivale al codice UNICODE 65, quindi viene dopo il 2.
Complementare al shift che toglie il primo valore, l’ unshift aggiunge un valore all’inizio
arr3.unshift(10);