只是好奇心问题。使用reduce函数,我们可以轻松地分别找到数组中最小和最大的数字。就像那样:
var a = [1,2,3,4,5,1,-1,6,7,8,9,10,2,11];
a.reduce(function(prev,cur,index,array){
return prev > cur ? prev : cur;
}); // returns 11
a.reduce(function(prev,cur,index,array){
return prev < cur ? prev : cur;
}); // returns -1
鉴于此,为什么这不起作用?
var a = [1,2,3,4,5,1,-1,6,7,8,9,10,2,11];
var smallest = 0;
var biggest = 0;
a.reduce(function(prev,cur,index,array){
smallest = prev < cur ? prev : cur;
biggest = prev > cur ? prev : cur;
});
console.log([smallest, biggest]); // prints [11,11]
在repl.it上测试。
答案 0 :(得分:5)
以下内容:
a.reduce(function(prev,cur,index,array){
smallest = prev < cur ? prev : cur;
biggest = prev > cur ? prev : cur;
});
提供给 reduce 的函数没有return语句,因此返回 undefined 。因此,在第一次迭代之后, prev 被设置为 undefined 。
如果abstract relational comparison algorithm中的任何一个表达式未定义,则表达式将返回 undefined (请参阅步骤3.c),其计算结果为 false 。因此,从第二次迭代开始,最小和最大都设置为 cur ,最后它们都设置为最后一个值数组。
答案 1 :(得分:2)
两个问题。
首先,reduce
的lambda参数没有返回值。如果您不打算返回某些内容,reduce
仅为forEach
,其中包含更多参数并不代表任何内容。
其次,在每个元素中,您将cur
与prev
进行比较,而不是将cur
与biggest
和smallest
进行比较。
答案 2 :(得分:1)
使用reduce时,你需要在reduce内部返回一些东西,否则会减少以前的值。
var a = [1,2,3,4,5,1,-1,6,7,8,9,10,2,11];
var initial = {
smallest: a[0],
biggest: a[0]
};
var result = a.reduce((prev, cur) => {
prev.smallest = prev < cur ? prev : cur;
prev.biggest = prev > cur ? prev : cur;
return { smallest, biggest};
}, initial);
console.log(result);
// Prints object as,
// { smallest: -1, biggest: 11 }
答案 3 :(得分:0)
我知道这很古老,但这里是如何使用数组reduce来解决这些问题:
var a = [1,2,3,4,5,1,-1,6,7,8,9,10,2,11];
var minNumber = a.reduce(function(prev,cur) {
return prev < cur ? prev : cur;
}, +Infinity);
var maxNumber = a.reduce(function(prev,cur) {
return prev > cur ? prev : cur;
}, -Infinity);