Utilizzo del ciclo 'reduce' vs 'per' per il ritorno di booleano [chiuso]

3

Mi stavo chiedendo cosa pensino le persone sull'uso di una funzione di riduzione rispetto al ciclo for che restituisce true se esiste una condizione.

Esempio:

var a = [1, 5, 7, 4, 2, 5, 3];

var greaterThan5 = a.reduce(function(prev, val) {
    return (prev || val > 5);
}, false);

vs

var greaterThan5 = false;
for(var i = 0; i < a.length; i++) {
    if(a[i] > 5) {
        greaterThan5 = true;
        break;
    }
}

vs

var i = 0;
var greaterThan5 = false;
while(!greaterThan5 && i < a.length) {
    greaterThan5 = (a[i] > 5);
    i++;
}

Il ciclo for loop e while usciranno quando la condizione è vera, ma penso che la sintassi di riduzione sia più facile da leggere e dia meno spazio agli errori di runtime.

    
posta Tony Brix 15.08.2015 - 08:05
fonte

2 risposte

15

Prima di tutto, perché non utilizzare Array.prototype.some() , che sembra corrispondere perfettamente a quello che stai effettivamente cercando di fare.

The some() method tests whether some element in the array passes the test implemented by the provided function.

Ovviamente, questo non risponde alla tua domanda: se usare il ciclo for o la chiamata a Array.protoype.reduce() ? Lasciatemi anche provare a rispondere a questo. La domanda riguarda principalmente la valutazione del peso rispetto alla chiarezza del codice.

Per prestazioni: misura, non solo usando array casuali, ma usando array che hanno senso nel tuo progetto. Non è necessario selezionare un metodo che funzioni velocemente su 1.000.000 di array di elementi, quando tutto ciò di cui hai bisogno per elaborare sono array con un massimo di 10 elementi.

Ancora più importante, preoccupati solo delle prestazioni quando le prestazioni sono un problema.

Riguardo alla chiarezza. In realtà penso che il ciclo for esplicito sia più chiaro di Array.prototype.reduce() . Ma ciò che conta di più è ciò che le persone della tua squadra troveranno più chiare. Se uno dei tuoi team trova un ciclo esplicito per il ciclo più chiaro, probabilmente è meglio usarlo, se non altro perché utilizza un set di funzioni meno avanzato.

    
risposta data 15.08.2015 - 08:40
fonte
5

Per la maggior parte delle lingue funzionali, nessuna delle due.

Di solito c'è una funzione di riduzione che circola brevemente come desideri.

In F # questa è List.exists quindi il tuo esempio sarebbe

List.exists (fun x -> x > 5) a

In Haskell (con applicazione parziale di > per creare una soluzione senza punti)

any (> 5) a
    
risposta data 15.08.2015 - 08:30
fonte

Leggi altre domande sui tag