38.2 filter, some , every, reduce

filter

abbiamo il seguente array

let numbers = [2,4,6,7,8,9,57,7];

supponiamo che da questo array vogliamo filtrare solamente i numeri pari, useremo il metodo filter, il quale si aspetta una funzione di callback che riceve i parametri: elemento , indice e array, secondo questa sintassi:

numbers.filter(callback_function( elemento , indice , array ) { return condizione da applicare}, eventuale oggetto $this );

Il metodo filter crea un nuovo array chiamando la funzione di callback ricorsivamente su ogni elemento dell’array sul quale è applicato il metodo. Se la restituzione della condizione contenuta nella funzione è TRUE all’ora inserisce quell’elemento nel nuovo array creato dal metodo filter, altrimenti non lo inserisce e passa al successivo elemento.

Estraiamo i numeri pari dall’array numers:

let evens = numbers.filter(function( ele , index , arr ) {
    return ele%2 === 0;
} );
console.log(evens);

In realtà posso omettere il secondo e terzo parametro ( index e arr) perchè non vengono utilizzati nel nostro esempio e vengono generati in automatico.

Separando la funzione per fare un altro esempio, calcoliamo i numeri dispari:

function dispari(valore){
    return valore%2 !== 0;
}
let odds = numbers.filter(dispari);
console.log(odds);

Lo stesso esempio dei numeri dispari è molto comodo rifarlo utilizzando una arrow function che spiegheremo più avanti:

let dispari = numbers.filter( (ele) => ele%2!==0);
console.log(dispari);

some , every

Il metodo some ritorna TRUE se almeno UNO dei valori dell’array soddisfa la condizione specificata nella funzione, mentre every ritorna TRUE se TUTTI gli elementi dell’array soddisfano la condizione specificata nella funzione passata.

Verifico se tutti gli elementi dell’array numbers sono pari:

let tuttiElemnti = numbers.every( v => v%2==0);
console.log('tutti pari ='+ ' ' + tuttiElemnti);

il valore di tuttiElementi sarà FALSE, se cancello nell’array i numeri dispari ottengo TRUE

reduce

supponiamo di voler sommare gli elementi dell’array numbers, mi serve un metodo che iteri gli elementi tra loro, ecco che reduce risolve il problema. Reduce applica la funzione tra gli elementi, restituendo un solo risultato (ridotto).

let sum = numbers.reduce( function ( prec , success ) {
    return prec + success;
});
console.log(sum);

vediamo la versione con la funzione freccia, che questa volta ha 2 parametri

let sum = numbers.reduce(  (prec, success) => prec + success);
console.log(sum);