Verwendung der Reduce-Funktion, um ein Array zurückzugeben
Lesezeit: 4 Minuten
Warum erhalte ich eine Fehlermeldung, wenn ich die Push-Funktion innerhalb der Reduce-Funktion verwenden möchte, um ein neues Array zurückzugeben? Wenn ich jedoch die concat-Methode innerhalb der Reduce-Funktion verwende, gibt sie problemlos ein neues Array zurück.
Alles, was ich versuche, ist, ein Array an die Reduce-Funktion zu übergeben und dasselbe Array zurückzugeben.
var store = [0,1,2,3,4];
var stored = store.reduce(function(pV,cV,cI){
console.log("pv: ", pV);
return pV.push(cV);
},[]);
Dies gibt einen Fehler zurück. Aber wenn ich concat verwende:
var store = [0,1,2,3,4];
var stored = store.reduce(function(pV,cV,cI){
console.log("pv: ", pV);
return pV.concat(cV);
},[]);
Es gibt das gleiche Array zurück.
Irgendwelche Ideen warum?
return PV.push bedeutet, dass PV bei der nächsten Iteration eine Zahl und kein Array sein wird, da push die Länge des Arrays zurückgibt – wenn Sie möchten, können Sie dies tun return pV.push(cV), pV; – Es gibt jedoch keinen Vorteil, außer 1 Codezeile weniger, dh pV.push(cV); return pV;
– Jaromanda X
16. Februar 2016 um 11:27 Uhr
wenn Sie nur das Array “kopieren” möchten … var stored = store.slice(); Wird besorgt
– Jaromanda X
16. Februar 2016 um 11:30 Uhr
@ Andy möchte ich das näher erläutern? Das Dokumentebuchstäblich Zustand map calls a provided callback function once for each element in an array, in order, and constructs a new array from the results was perfekt zu beschreiben scheint, was der Fragesteller tat.
– Jamiec
16. Februar 2016 um 11:48 Uhr
@Andy – man kann mit dem Schuhabsatz einen Nagel in die Wand schlagen – aber generell bevorzugen wir das richtige Werkzeug für den richtigen Job! Lesen Sie die Dokumentation zu beiden Methoden oder lesen Sie einfach meine Antwort unten.
– Jamiec
16. Februar 2016 um 11:59 Uhr
@Andy – Um einen Nagel in eine Wand zu schlagen, brauchen Sie einen Hammer, keinen Schuh (dasselbe gilt)
– Jamiec
16. Februar 2016 um 12:01 Uhr
Venkata Raju
push gibt die neue Länge des Arrays zurück.
Was Sie brauchen, ist das anfänglich bereitgestellte Array.
Ändern Sie also den Code wie folgt.
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 gibt das neue Array zurück, das die Elemente des bereitgestellten Arrays und die verketteten Elemente kombiniert. es funktioniert also.
Jamiec
Nur der Vollständigkeit halber und für die nächste Person, die auf diese Frage stößt, wird das, was Sie tun, normalerweise erreicht map was, wie in den Dokumenten angegeben
map ruft eine bereitgestellte Callback-Funktion einmal für jedes Element in einem Array der Reihe nach auf und erstellt aus den Ergebnissen ein neues Array
Vergleichen Sie das mit der Beschreibung von reduce:
Die Methode Reduce() wendet eine Funktion auf einen Akkumulator und jeden Wert des Arrays (von links nach rechts) an, um ihn zu reduzieren zu einem einzigen Wert.
(Hervorhebung von mir) Sie sehen also, obwohl Sie kann manipulieren reduce Um ein neues Array zurückzugeben, wird es im Allgemeinen verwendet, um ein Array auf einen einzelnen Wert zu reduzieren.
Für Ihren Code wäre dies also:
var store = [0,1,2,3,4];
var stored = store.map(function(pV){
console.log("pv: ", pV);
return pV;
});
Viel einfacher als zu versuchen, ein neues Array mit einem von beiden zu rekonstruieren push oder concat innerhalb eines reduce Funktion.
Manchmal möchten Sie eine .filter().map() und anstatt O (2N) zu sein, können Sie die Arbeit halbieren, indem Sie einen einzigen Durchgang mit ausführen .reduce()halten Sie sich O (N).
– doof
25. November 2020 um 15:23 Uhr
Ich nehme an, bei ECMA wird es so etwas sein store.map(it => {return it});?
– Fedorqui
30. November 2020 um 11:11 Uhr
@fedorqui’SOstopharming’ store.map(it => ({it})) wird auch funktionieren.
– Jamiec
30. November 2020 um 11:32 Uhr
Exzellent! Während ich denke, ich würde mit der Version mit a gehen returnso ist es für mich einfacher zu verstehen 🙂
– Fedorqui
30. November 2020 um 11:34 Uhr
Ich weiß, dass dies die gleiche Antwort ist, aber ich möchte das nur mit zeigen reduce ()kann die Syntax mit ES6 auch auf eine einzige Codezeile reduziert werden:
var store = [0,1,2,3,4];
var stored = store.reduce((pV,cV) => [...pV, cV], []);
console.log(stored);
abitofcode
reduce() kann nützlich sein, wenn Sie ein Array mit mehreren Elementen für jedes iterierte Element zurückgeben müssen:
Array.prototype.concat Die Methode fügt ein neues Element in das Array ein und gibt das Array zurück, damit es weiter verarbeitet werden kann. Dies ist, was Sie mit Reduce tun müssen: Übergeben Sie das modifizierte Array bei der nächsten Iteration.
Aber es ist nicht dasselbe Array; concat weist ein neues Array zu, das ineffizient ist.
– Quolonel-Fragen
4. Dezember 2017 um 21:53 Uhr
Sie können immer die Destrukturierung verwenden:
var store = [0,1,2,3,4];
var stored = store.reduce(function(pV,cV,cI){
console.log("pv: ", pV);
return [...pV, cV];
},[]);
console.log(stored);
Aber es ist nicht dasselbe Array; concat weist ein neues Array zu, das ineffizient ist.
– Quolonel-Fragen
4. Dezember 2017 um 21:53 Uhr
14043200cookie-checkVerwendung der Reduce-Funktion, um ein Array zurückzugebenyes
return PV.push
bedeutet, dass PV bei der nächsten Iteration eine Zahl und kein Array sein wird, da push die Länge des Arrays zurückgibt – wenn Sie möchten, können Sie dies tunreturn pV.push(cV), pV;
– Es gibt jedoch keinen Vorteil, außer 1 Codezeile weniger, dhpV.push(cV); return pV;
– Jaromanda X
16. Februar 2016 um 11:27 Uhr
wenn Sie nur das Array “kopieren” möchten …
var stored = store.slice();
Wird besorgt– Jaromanda X
16. Februar 2016 um 11:30 Uhr
@ Andy möchte ich das näher erläutern? Das Dokumente buchstäblich Zustand
map calls a provided callback function once for each element in an array, in order, and constructs a new array from the results
was perfekt zu beschreiben scheint, was der Fragesteller tat.– Jamiec
16. Februar 2016 um 11:48 Uhr
@Andy – man kann mit dem Schuhabsatz einen Nagel in die Wand schlagen – aber generell bevorzugen wir das richtige Werkzeug für den richtigen Job! Lesen Sie die Dokumentation zu beiden Methoden oder lesen Sie einfach meine Antwort unten.
– Jamiec
16. Februar 2016 um 11:59 Uhr
@Andy – Um einen Nagel in eine Wand zu schlagen, brauchen Sie einen Hammer, keinen Schuh (dasselbe gilt)
– Jamiec
16. Februar 2016 um 12:01 Uhr