在javascript中使用reduce函数查找最小和最大数量的数组

时间:2014-09-28 20:31:28

标签: javascript

只是好奇心问题。使用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上测试。

4 个答案:

答案 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,其中包含更多参数并不代表任何内容。

其次,在每个元素中,您将curprev进行比较,而不是将curbiggestsmallest进行比较。

答案 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);
相关问题