Domanda

Sto cercando di decidere se utilizzare il metodo di riduzione () in JavaScript per una funzione che devo scrivere, il che è qualcosa di simile

var x = [some array], y = {};
for (...) {
    someOperation(x[i]);
    y[x[i]] = "some other value";
}

Ora questo può ovviamente essere scritto come una funzione di riduzione () nel modo seguente:

x.reduce(function(prev, current, index, arr) {
    someOperation(current);
    prev[current] = "some other value";
    return prev;
}, {})

O qualcosa di simile. C'è qualche prestazione o altra differenza tra i due? O qualche altro motivo (come il supporto del browser, ad esempio) a causa di cui si dovrebbe essere favoriti rispetto all'altro in un ambiente di programmazione web? Grazie.

È stato utile?

Soluzione

Anche se preferisco queste operazioni (riduzione, mappa, filtro, ecc.), Non è ancora possibile usarle a causa di certo browser che non li supportano nelle loro implementazioni. Certo, puoi "patcharlo" estendendo il Array prototipo, ma sta aprendo anche una lattina di vermi.

Non penso che ci sia qualcosa di intrinsecamente sbagliato in queste funzioni, e penso che producano un codice migliore, ma per ora è meglio non usarle. Una volta che una percentuale più alta della popolazione utilizza un browser che supporta queste funzioni, penso che saranno un gioco equo.

Per quanto riguarda le prestazioni, questi saranno probabilmente più lenti della mano scritta per i loop a causa delle spese generali delle chiamate di funzione.

Altri suggerimenti

map e filter e reduce e forEach e ... (maggiori informazioni: https://developer.mozilla.org/en/javascript/reference/global_objects/array#iteration_methods ) sono molto meglio dei loop normali perché:

  1. Sono più eleganti
  2. Incoraggiano la programmazione funzionale (vedere i vantaggi della programmazione funzionale)
  3. Dovrai scrivere funzioni comunque e passarci, come parametri, variabili di iterazione. Questo perché JavaScript non ha un ambito a blocchi. Funzioni come map e reduce Rendi il tuo lavoro molto più semplice perché impostano automaticamente la tua variabile di iterazione e lo trasmettono nella tua funzione per te.

IE9 afferma di supportarli. Sono nelle specifiche ufficiali di JavaScript/ECMascript. Se ti interessa le persone che usano IE8, questa è la tua prerogativa. Se ti interessa davvero, puoi hackerarlo prevalere Array.prototype solo per IE8 e più vecchio, per "riparare" IE8 e più.

La riduzione viene utilizzata per restituire un valore da un array, a seguito dell'elaborazione in sequenza dei risultati degli elementi precedenti.

Il Reduttore fa lo stesso, ma inizia alla fine e funziona all'indietro.

La mappa viene utilizzata per restituire un array i cui membri sono stati tutti passati attraverso una funzione.

Nessuno dei due metodi influisce sull'array stesso.

var a1 = ['1', '2', '3', '4', '5', '6', '7', '8'];

// Questo uso della mappa restituisce un nuovo array di elementi originali, convertito in numeri-

A1 = a1.map (numero); // >> ciascuno degli elementi di A1 convertiti in un numero

// Ciò riduce gli elementi dell'array-

var a1sum = a1.Reduce (funzione (a, b) {return a+b;});

// a1sum >> valore restituito: (numero) 36

Non sono supportati nei browser più vecchi, quindi dovrai fornirli un sostituto. Non ne vale la pena se tutto ciò che stai facendo può essere replicato in un semplice ciclo.

Figura che la deviazione standard di una popolazione è un esempio in cui sia la mappa che la riduzione possono essere effettivamente utilizzate-

Math.mean= function(array){
    return array.reduce(function(a, b){ return a+b; })/array.length;
}
Math.stDeviation=function(array){
    var mean= Math.mean(array);
    dev= array.map(function(itm){return (itm-mean)*(itm-mean); });
    return Math.sqrt(dev.reduce(function(a, b){ return a+b; })/array.length);
}


var A2= [6.2, 5, 4.5, 6, 6, 6.9, 6.4, 7.5];
alert ('mean: '+Math.mean(A2)+'; deviation: '+Math.stDeviation(A2))

Kennebec - Bene, ma il tuo stdeviazione chiama di funzione ridurre due volte e carta geografica Una volta quando ha bisogno solo di una sola chiamata a ridurre (che lo rende molto più veloce):

Math.stDev = function (a) {
    var n = a.length;
    var v = a.reduce(function (v, x) {
      v[0] += x * x;
      v[1] += x;
      return v;
    }, [0,0]);
    return Math.sqrt( (v[0] - v[1]*v[1] / n) / n );
}

Dovrebbe fare una conversione in numero quando si assegna a V [1 Per assicurarsi che i numeri di stringa non stiano facendo un casino con il risultato e il divisore nell'ultima riga dovrebbe essere probabile (n - 1) nella maggior parte dei casi, ma dipende all'OP. :-)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top