2015-07-05 11 views
8

C'è un modo migliore invece di aggiungere valori di array utilizzando una funzione di generatore come chiusura?Qual è il modo migliore per sommare gli array utilizzando ECMASCRIPT 6 Generatore/Funzioni

var sumArrays = function(){ 
    var sum = 0; 
    return function*(){ 
    while(true){ 
     var array = yield sum; 
     if(array.__proto__.constructor === Array){ 
     sum += array.reduce(function(val,val2){ return val+val2; }); 
     } 
     else sum=0; 
    } 
    }; 
}; 

var gen = sumArrays(); 
// is this step required to make a generator or could it be done at least differently to spare yourself from doing this step? 
gen = gen(); 

// sum some values of arrays up 
console.log('sum: ',gen.next()); // Object { value=0, done=false} 
console.log('sum: ',gen.next([1,2,3,4])); // Object { value=10, done=false} 
console.log('sum: ',gen.next([6,7])); // Object { value=23, done=false} 

// reset values 
console.log('sum: ',gen.next(false)); // Object { value=0, done=false} 
console.log('sum: ',gen.next([5])); // Object { value=5, done=false} 

risposta

16

Questo non sembra essere un problema che i generatori dovrebbero risolvere, quindi non utilizzerei un generatore qui.

Direttamente utilizzando reduce (ES5) sembra essere più appropriato:

let sum = [1,2,3,4].reduce((sum, x) => sum + x); 

In funzione:

function sum(arr) { 
    return arr.reduce((sum, x) => sum + x); 
} 

Se davvero si vuole sommare più array attraverso chiamate di funzione più, per poi tornare a normale funzione:

function getArraySummation() { 
    let total = 0; 
    let reducer = (sum, x) => sum + x; 
    return arr => total + arr.reduce(reducer); 
} 

let sum = getArraySummation(); 
console.log('sum:', sum([1,2,3])); // sum: 6 
console.log('sum:', sum([4,5,6])); // sum: 15 

Mantenerlo semplice.

Problemi correlati