一个在javascript中找到数组最高值的函数?

时间:2018-01-28 22:12:36

标签: javascript arrays function

我想创建一个函数来确定我花费更多钱的一周中哪一天,如果两天或更多天的金额最高,则应返回包含日期的数组,或者如果输入为null或空数组,该函数应返回null。

但我很困惑。到目前为止,我已经尝试编写按降序对数组进行排序的函数,但它看起来并不正确:

highamount= [50, 100, 2];   

highamount.sort(function(amount[0],amount[1])) { 

return amount[1]-amount[0]; 
}

有什么问题?如果我以前没有定义过的数组,并且只是想在调用函数时对它进行排序,那么该函数会出现什么呢?

我是Javascript的新手,我需要帮助。

3 个答案:

答案 0 :(得分:2)

您的代码段存在问题

  • 此行不正确 highamount.sort(function(amount[0], amount[1])),因为您使用额外的括号关闭了comparator函数。
    highamount.sort(function(amount[0], amount[1]))
                                                  ^
  • 您未在compare函数中声明参数,而是访问未定义的对象/数组amount
        function(amount[0], amount[1])
                 ^          ^
  • 比较函数的逻辑存在问题,因为您正在访问未定义的对象/数组amount,这与之前的问题类似。
        amount[1] - amount[0]
        ^           ^
  • 您没有正确关闭sort功能,它缺少右括号。
        return amount[1] - amount[0];
    };
    ^
  • 很好,现在让我们分析一下你的逻辑。

想象一下,您的代码具有正确的语法:

var highamount = [50, 100, 2];

highamount.sort(function(a, b) { 
  return a - b; 
});

console.log(highamount);

请参阅?你的逻辑很好,因为数组highamount已被排序。现在您可以获得执行的最大值:highamount[highamount.length - 1]

更好的方法

很好,我们如何改进您的方法,以便从数组highamount中找到最大值。

最新的Javascript版本提供了完成场景的良好功能:

使用该运算符,您可以逐字传播数组并将其值作为参数传递给其他函数,数组等。

因此,您可以执行以下操作:

var highamount = [50, 100, 2];

var max = Math.max(...highamount);

console.log(max);

请参阅?令人惊讶的是,Javascript如何提供一种可读的方式来完成您的方案。

现在,您写道:如果我之前没有定义过的数组,并且只是想在调用函数时对其进行排序,那么该函数会出现什么呢?

最终方法

好吧,你可以声明一个接收数组的函数来找到最大值。

运行此代码段:

var highamount = [50, 100, 2];

var findMax = function(array) {
  return array === undefined || array === null || array.length === 0 ? null : Math.max(...array);
}

console.log(findMax(highamount));
console.log(findMax(null));
console.log(findMax(undefined));
console.log(findMax([]));

请参阅?函数findMax根据传递的数组返回最大值。

资源

答案 1 :(得分:1)

您可以使用ES2015 spread syntaxMath.max进行非常简短的单行播放:

const numbers = [1, 5, 74, 27, 2, 8, 442, 12];
const largest = Math.max(...numbers); // > 442

传播语法将numbers的所有成员作为Math.max的参数传递。因此,以下两个陈述是等效的:

Math.max(...numbers);
Math.max(1, 5, 74, 27, 2, 8, 442, 12);

答案 2 :(得分:0)

标题问题与帖子正文中提出的问题不同,这就是没有其他人给你正确答案的原因。您需要具有最高值的天数索引数组。在任何一种情况下,都不需要排序。

如果你想要一个最高值的索引数组(或者你所说的天数组)。那么我就是这样做的:

Blob

如果你只想要最高值,你所要做的就是遍历数组。

if (highAmount.length === 0) {
    return null;
}
let highest = highAmount[0];
let indexes = [0];
for (var i = 1; i < highAmount.length; i++) {
    if (highest < highAmount[i]) {
        highest = highAmount[i];
        indexes = [i];
    }else if(highest = highAmount[i]){
        indexes.push(i);
    }
}
return indexes;

或者只使用Math.max(... highAmount)