JavaScript reduce 无法处理数学函数?

发布于 2024-12-10 00:58:46 字数 957 浏览 0 评论 0原文

我正在尝试一项显而易见的任务:

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

有人能告诉我为什么吗?两者都是接受两个参数并返回一个值的函数。有什么区别?

另一个例子可能是这样的:

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中没有concat):

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

为什么是那?

I'm trying an obvious task:

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

and get:

NaN

as the result. To make it work I have to make an anonymous function this way:

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

Could someone tell me why? Both are functions that take two arguments and both return one value. What's the difference?

Another example could be this:

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

The result is:

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

I can run this example in node.js only under this shape (Array has no concat in node.js v4.12, which I use now):

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

and then get this:

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

And why is that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

公布 2024-12-17 00:58:46

传递给 reduce 的函数需要超过2 个参数

  • previousValue
  • currentValue
  • index
  • array

Math.max 将评估全部参数并返回最高值:

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

因此,如果将 Math.max 传递给 reduce,它将返回所传递的 4 个参数中的最高值,其中一个是数组。传递数组将使 Math.max 返回 NaN,因为数组不是数字。这是规范 (15.8.2.11) 中的内容:

给定零个或多个参数,对每个参数调用 ToNumber 并返回结果值中的最大值。

...

如果任意值为 NaN,则结果为 NaN

ToNumber 将为数组返回 NaN

因此,使用 Math.max 进行归约最终将返回 NaN

The function passed to reduce takes more than 2 arguments:

  • previousValue
  • currentValue
  • index
  • array

Math.max will evaluate all arguments and return the highest:

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

So in case of passing Math.max to reduce, it will return the highest value from the 4 arguments passed, of which one is an array. Passing an array will make Math.max return NaN because an array is not a number. This is in the specs (15.8.2.11):

Given zero or more arguments, calls ToNumber on each of the arguments and returns the largest of the resulting values.

...

If any value is NaN, the result is NaN

ToNumber will return NaN for an array.

So reducing with Math.max will return NaN in the end.

聽兲甴掵 2024-12-17 00:58:46

由于 Math.max 接受多个参数,因此您只需通过 apply 函数将数组转换为参数列表即可。

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

请参阅此处的警告了解此技术的局限性。

Since Math.max accepts multiple arguments, you can just convert the array to a parameter list via the apply function.

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

See warnings here on limitations of this technique.

人生百味 2024-12-17 00:58:46

将数组减少到最大值的另一种方法:(

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

说明了减少的工作原理,但并不是说这是从数组中获取最大数的最佳方法)

Another way to reduce an array to its max value:

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

(illustrating how reduce works, not that it is the best way to get the max number from an array)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文