JavaScript reduce kann Math-Funktionen nicht verarbeiten?

8

Ich versuche eine offensichtliche Aufgabe:

%Vor%

und erhalten:

%Vor%

als Ergebnis. Damit es funktioniert, muss ich auf diese Weise anonym arbeiten:

%Vor%

Könnte mir jemand sagen warum ? Beide sind Funktionen, die zwei Argumente annehmen und beide einen Wert zurückgeben. Was ist der Unterschied?

Ein anderes Beispiel könnte das sein:

%Vor%

Das Ergebnis ist:

%Vor%

Ich kann dieses Beispiel in node.js nur unter dieser Form ausführen (Array hat keine concat in node.js v4.12, die ich jetzt verwende):

%Vor%

und dann:

%Vor%

Und warum ist das?

    
trzewiczek 14.10.2011, 12:41
quelle

3 Antworten

16

Die an reduce übergebene Funktion benötigt mehr als 2 Argumente :

  • previousValue
  • currentValue
  • index
  • array

Math.max wertet alle Argumente aus und gibt die höchste zurück:

%Vor%

Wenn also Math.max an reduce übergeben wird, wird der höchste Wert aus den 4 übergebenen Argumenten zurückgegeben, von denen einer ein Array ist. Wenn ein Array übergeben wird, wird Math.max return NaN zurückgegeben, weil ein Array keine Zahl ist. Dies ist in den Spezifikationen (15.8.2.11):

  

Gibt null oder mehr Argumente an, ruft ToNumber für jedes der Argumente auf und gibt den größten der resultierenden Werte zurück.

     

...

     

Wenn ein Wert NaN ist, ist das Ergebnis NaN

ToNumber gibt NaN für ein Array zurück.

Wenn Sie also mit Math.max reduzieren, erhalten Sie am Ende NaN zurück.

    
pimvdb 14.10.2011, 12:46
quelle
4

Da Math.max mehrere Argumente akzeptiert, können Sie das Array einfach über die Funktion apply in eine Parameterliste konvertieren.

%Vor%

Siehe Warnungen hier zu den Einschränkungen dieser Technik.

    
Raymond Chen 14.10.2011 13:14
quelle
2

Eine weitere Möglichkeit, ein Array auf seinen Maximalwert zu reduzieren:

%Vor%

(veranschaulicht, wie reduce funktioniert, nicht, dass es die beste Möglichkeit ist, die maximale Anzahl von einem Array zu erhalten)

    
kennebec 14.10.2011 12:52
quelle