我在示例中使用Math.max 回答了一个与Array.reduce有关的问题,但发现了一些我不理解的东西:
这有效:
let values=[4,5,6,77,8,12,0,9];
let max=values.reduce((acc,curr) => Math.max(acc,curr),0);
console.log(max);Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试这样的事情:
let values=[4,5,6,77,8,12,0,9];
let max=values.reduce(Math.max,0);
console.log(max);Run Code Online (Sandbox Code Playgroud)
它返回NaN。
我认为上下文是原因,因此我写了以下内容:
let max=Math.max;
console.log(max(2,5));Run Code Online (Sandbox Code Playgroud)
但它按预期工作!
我想念什么?MDN表示:
如果至少一个参数不能转换为数字,则返回NaN。
您所缺少的是,的回调reduce具有比累加器和当前数组值更多的参数。它实际上有4。
请参阅文档:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Description
该四个参数:
accumulator
currentValue
currentIndex
array (a reference to the array itself)
Run Code Online (Sandbox Code Playgroud)
问题是第四个参数,reduce调用的是数组本身。Math.max无法处理数组,因此返回NaN。
编辑:相反,您可以使用apply方法或新的价差运算符!
let values = [4,5,6,77,8,12,0,9];
let max = Math.max.apply(null, values);
let maxAnotherWay = Math.max(...values);
Run Code Online (Sandbox Code Playgroud)
或者,如果你碰巧使用Lodash,该_.ary方法可以让你换功能,限制它的另一个功能参数数量:
let values = [4,5,6,77,8,12,0,9];
let max = values.reduce(_.ary(Math.max, 2),0);
Run Code Online (Sandbox Code Playgroud)