2016-02-16 14 views
6

Perché quando si desidera utilizzare la funzione di spinta all'interno della funzione di riduzione per restituire un nuovo array, viene visualizzato un errore. Tuttavia, quando uso il metodo concat all'interno della funzione reduce, restituisce un nuovo array senza problemi.Utilizzo della funzione di riduzione per restituire un array

Tutto quello che sto cercando di fare è passare un array alla funzione di riduzione e restituire lo stesso array.

var store = [0,1,2,3,4]; 

var stored = store.reduce(function(pV,cV,cI){ 
    console.log("pv: ", pV); 
    return pV.push(cV); 
},[]); 

Questo restituisce un errore. Ma quando uso concat:

var store = [0,1,2,3,4]; 

var stored = store.reduce(function(pV,cV,cI){ 
    console.log("pv: ", pV); 
    return pV.concat(cV); 
},[]); 

Restituisce lo stesso array.

Qualche idea, perché?

+1

'return PV.push' significa sulla prossima iterazione, PV sarà un numero, non un array, perché push restituisce la lunghezza dell'array - se vuoi, puoi fare 'return pV.push (cV), pV;' - però, c'è nessun beneficio tranne per 1 riga di codice in meno, ad esempio 'pV.push (cV); return pV; ' –

+0

se tutto ciò che si vuole fare è" copiare "l'array ...' var stored = store.slice(); 'farà –

+0

Per restituire un nuovo array da un array, si desidera' map' not' reduce'. – Jamiec

risposta

14

push restituisce la nuova lunghezza della matrice.

Quello che ti serve è l'array inizialmente fornito.

Quindi modificare il codice come di seguito.

var store = [0,1,2,3,4]; 

var stored = store.reduce(function(pV,cV,cI){ 
    console.log("pv: ", pV); 
    pV.push(cV); 
    return pV; // ********* Important ****** 
}, []); 

concat restituisce il nuovo array combinando gli elementi della matrice fornito e elementi concatenati. quindi funziona.

1

Array.prototype.push il metodo restituisce la nuova lunghezza dell'array.

Array.prototype.concat Il metodo inserisce un nuovo elemento nell'array e restituisce l'array indietro in modo che possa essere ulteriormente elaborato. Questo è quello che devi fare con riduci: passa l'array modificato alla successiva iterazione.

+0

Ma non è lo stesso array; 'concat' alloca un nuovo array che è inefficiente. –

3

Solo per completezza, e per la prossima persona che accade su questa domanda, quello che stai facendo è tipicamente realizzato con map che, come detto nella documentazione

mappa chiama una funzione di callback forniti una volta per ciascun elemento di un array, in ordine, e crea un nuovo array dai risultati

contrasto che la descrizione di reduce:

Il metodo reduce() applica una funzione contro un accumulatore e ogni valore dell'array (da sinistra a destra) per ridurlo a in un unico valore.

(enfasi mia) Quindi, vedete, anche se è possibile manipolare reduce per restituire un nuovo array, è uso generale è quello di ridurre un array a un singolo valore.

Così, per il codice di questo sarebbe:

var store = [0,1,2,3,4]; 

var stored = store.map(function(pV){ 
    console.log("pv: ", pV); 
    return pV; 
}); 

Molto più semplice che cercare di ricostruire un nuovo array utilizzando push o concat all'interno di una funzione reduce.

Problemi correlati