2016-02-16 25 views
6

Dlaczego, gdy chcę użyć funkcji wypychania wewnątrz funkcji zmniejszania, aby zwrócić nową tablicę, pojawia się błąd. Jednakże, gdy używam metody concat w funkcji zmniejszenia, zwraca ona nową tablicę bez problemu.Korzystanie z funkcji zmniejszenia w celu zwrócenia tablicy

Wszystko, co próbuję zrobić, to przekazać tablicę do funkcji zmniejszenia i zwrócić tę samą tablicę.

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

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

Powoduje błąd. Ale kiedy używam concat:

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

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

Zwraca tę samą tablicę.

Jakieś pomysły, dlaczego?

+1

'return PV.push' oznacza, że ​​w następnej iteracji, PV będzie liczbą, a nie tablicą, ponieważ push zwraca długość tablicy - jeśli chcesz, możesz zrobić 'return pV.push (cV), pV;' - choć istnieje brak korzyści z wyjątkiem 1 mniejszej linii kodu, np. 'pV.push (cV); return pV; ' –

+0

jeśli wszystko, co chcesz zrobić, to" skopiować "tablicę ...' var stored = store.slice(); 'zrobi –

+0

Aby zwrócić nową tablicę z tablicy, potrzebujesz' map' nie ' zmniejszyć ". – Jamiec

Odpowiedz

14

push zwraca nową długość tablicy.

Potrzebna jest wstępnie dostarczona tablica.

Zmień kod, jak poniżej.

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 zwraca nową tablicę łączącą elementy przewidziane matrycy i elementów połączonych. więc to działa.

1

Array.prototype.push Metoda zwraca nową długość tablicy.

Array.prototype.concat Metoda wstawia nowy element do tablicy i zwraca tablicę z powrotem, aby można było dalej przetwarzać. Oto, co musisz zrobić, aby zmniejszyć: modyfikować tablicę w następnej iteracji.

+0

Ale to nie jest ten sam układ; 'concat' przydziela nową tablicę, która jest nieefektywna. –

3

Tylko dla kompletności, a do następnej osoby, która dzieje się w tej kwestii, co robisz jest zazwyczaj osiągane z map które, jak stwierdzono w docs

mapa wywołuje podaną funkcję oddzwonienia raz każdy element tablicy, w kolejności, i tworzy się nową tablicę z wyników

kontrastujący z opisem reduce:

Metoda reduce() stosuje funkcję względem akumulatora i każdej wartości tablicy (od lewej do prawej), aby zmniejszyć wartość do pojedynczej wartości.

(podkreślenie moje) Jak więc widzisz, chociaż może manipulować reduce zwraca nową tablicę, to ogólnie wykorzystanie jest zmniejszenie tablicę do pojedynczej wartości.

Tak dla kodu byłoby:

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

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

znacznie prostsze niż próba rekonstrukcji nową tablicę używając albo push lub concat w reduce funkcji.