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 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

Benutzeravatar von Venkata Raju
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.

Benutzeravatar von Jamiec
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);

Benutzeravatar von abitofcode
abitofcode

reduce() kann nützlich sein, wenn Sie ein Array mit mehreren Elementen für jedes iterierte Element zurückgeben müssen:

var inputs = media.reduce((passedArray, video) => {
    passedArray.push("-i");
    passedArray.push(video.filepath);
    return passedArray;
}, []);

Hier wird es verwendet, um das Eingabearray für FFmpeg zu erstellen;

[{ name: "bob", filepath: "1.mp4" }, { name: "sue", filepath: "3.mp4" }]
=> ["-i", "1.mp4", "-i", "2.mp4]

Benutzeravatar von dfsq
dfsq

Array.prototype.push Die Methode gibt die neue Länge des Arrays zurück.

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


1404320cookie-checkVerwendung der Reduce-Funktion, um ein Array zurückzugeben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy