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

Find smallest and biggest number of an array with reduce function in javascript

本文关键字:最大数 数组 查找 javascript 中的 reduce 函数 使用      更新时间:2023-09-26

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

在以下内容中:

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

提供给reduce的函数没有return语句,因此它返回未定义。因此,在第一次迭代之后,prev被设置为未定义

如果抽象关系比较算法中的任一表达式未定义,则该表达式返回undefined(请参见步骤3.c),计算结果为false。因此,从第二次迭代开始,最小最大都设置为cur,最后它们都设置为数组中的最后一个值。

两个问题。

首先,reduce的lambda参数没有返回值。如果你不打算返回一些东西,reduce只是forEach,它有更多的参数,没有任何意义。

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

我知道这很古老,但以下是如何使用arrayreduce:解决这些问题

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

就我个人而言,我只会使用Math.min/max:

var a = [1,2,3,4,5,1,-1,6,7,8,9,10,2,11];
Math.min(...a) // will give -1
Math.max(...a) // will give 11

使用reduce时,需要返回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.smallest < cur ? prev.smallest : cur;
  prev.biggest = prev.biggest > cur ? prev.biggest : cur;
  return prev;
}, initial);
console.log(result);
// Prints object as,
// { smallest: -1, biggest: 11 }