2014-09-28 53 views
5

只是好奇的问题。使用reduce函数,我们可以轻松地分别找到数组中最小和最大的数字。就像那样:在javascript中查找带有缩小功能的最小和最大数组数

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

在下面:

a.reduce(function(prev,cur,index,array){ 
    smallest = prev < cur ? prev : cur; 
    biggest = prev > cur ? prev : cur; 
}); 

提供给功能降低没有返回语句,以便返回未定义。因此在第一次迭代之后,prev设置为undefined

如果abstract relational comparison algorithm任一表达式未定义,表达式返回未定义(参见步骤3.C),其计算结果为假。因此从第二次迭代开始,最小最大设置为当前并且最后它们都被设置为数组中的最后一个值。

+0

谢谢你的答案。当我添加一个带有“最小”变量的return语句时,所有的东西都起作用了。虽然@zerkms的答案像一个魅力一样工作(我已经测试过,我也想让它升温,但在我这样做之前它已被删除),你指出我正确地解决了这个问题。 – 2014-09-28 21:04:40

2

两个问题。

首先,到reduce的lambda参数没有返回值。如果你不想退货,reduce只是forEach与更多的参数,没有任何意义。其次,在每个元素处,您将curprev比较,而不是比较curbiggestsmallest

0

我知道这是一个古老但这里是如何解决使用数组等问题减少:

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

maxNumber应该用'-Infinity'初始化,而不是 – marmor 2017-03-30 13:30:15

+0

@marmor你说的对,我误写了,现在修正了 – Bamieh 2017-04-20 09:08:57

相关问题