13

私は明らかな仕事をしようとしています:

var maxVal = [ 1, 2, 3, 4, 5 ].reduce( Math.max, 0 );

そして得る:

NaN

結果として。それを機能させるには、次のように無名関数を作成する必要があります。

var maxVal = [ 1, 2, 3, 4, 5 ].reduce( function ( a, b ) { 
                                           return Math.max(a, b);
                                       }, 0 );

誰かが理由を教えてもらえますか? どちらも 2 つの引数を取り、1 つの値を返す関数です。違いは何ですか?

別の例は次のとおりです。

var newList = [[1, 2, 3], [4, 5, 6]].reduce( Array.concat, [] );

結果は次のとおりです。

[1, 2, 3, 0, #1=[1, 2, 3], #2=[4, 5, 6], 4, 5, 6, 1, #1#, #2#]

この例は、この形状の下でのみ node.js で実行できます (配列には、現在使用している node.js v4.12 に連結がありません)。

var newList = [[1, 2, 3], [4, 5, 6]].reduce( [].concat, [] );    

そして、これを取得します:

[ {}, {}, 1, 2, 3, 0, [ 1, 2, 3 ], [ 4, 5, 6 ], 4, 5, 6, 1, [ 1, 2, 3 ], [ 4, 5, 6 ] ]

なんで?

4

3 に答える 3

24

に渡された関数reduce は 2 つ以上の引数を取ります:

  • previousValue
  • currentValue
  • index
  • array

Math.maxすべての引数を評価し、最高のものを返します。

Math.max(1, 2, 3, 4) === 4;

したがって、 に渡す場合、渡さMath.maxreduceた 4 つの引数から最大値を返します。そのうちの 1 つは配列です。配列は数値ではないため、配列を渡すとMath.max返されます。NaNこれは仕様(15.8.2.11)にあります:

0 個以上の引数を指定すると、各引数で ToNumber を呼び出し、結果の値の最大値を返します。

...

いずれかの値が NaN の場合、結果は NaN になります

ToNumberNaN配列を返します。

したがって、 with を減らすと、最終的Math.maxに返さNaNれます。

于 2011-10-14T12:46:00.927 に答える
4

複数の引数を受け入れるためMath.max、関数を介して配列をパラメーター リストに変換するだけですapply

var maxVal = Math.max.apply(Math, [ 1, 2, 3, 4, 5 ]);

この手法の制限については、こちらの警告を参照してください。

于 2011-10-14T13:14:05.420 に答える
3

配列を最大値まで減らす別の方法:

var maxVal = [ 1, 2, 3, 4, 5 ].reduce(function(a,b){return a>b?a:b});

(reduce がどのように機能するかを示しています。配列から最大数を取得するのが最善の方法ではありません)

于 2011-10-14T12:52:46.740 に答える