如何将math.max简化为一组对象

时间:2018-12-20 04:30:35

标签: javascript

我有一个对象数组。我想从数组的number属性中获取最大值:

[
  {number: 1000, name: "Josh"}, 
  {number: 2000, name: "Joker"}, 
  {number: 3000, name: "Batman"}
]

我正在使用此解决方案,但我不断收到NAN

const max = arr.reduce((a, b) => Math.max(a.number, b.number));

我的目标是获取最大值,然后将其存储在变量中

const x = { number: 3000, name: "Batman"}

如何通过减少实现呢?似乎它仅适用于数字数组。

5 个答案:

答案 0 :(得分:10)

通过简单的reduce完成

var arr=[{"number":1000,"name":"Josh"},{"number":2000,"name":"Joker"},{"number":3000,"name":"Batman"}]
   
var x = arr.reduce((acc, i)=>(i.number > acc.number ? i : acc))

console.log(x)

答案 1 :(得分:4)

使用Array.prototype.reduce,您必须记住传递给回调的第一个参数是 accumulator 。也就是说,上一次迭代的返回值。

Math.max返回一个Number(如果无法对数字进行比较,则返回NaN),因此在第二次迭代中,您将尝试比较的number属性Number无效。

作为reduce的替代方法,您可能需要考虑对数组进行排序。如果您想要其他属性(例如最小值),这可能是有益的。

// smallest to largest, use "b.number - a.number" to reverse
arr.sort((a, b) => a.number - b.number) 
arr[0] // smallest
arr[arr.length - 1] // largest

答案 2 :(得分:2)

Math.max返回一个数字。在第一次迭代之后,a是一个数字,而不是对象,因此a.number返回undefined

当您将第二个参数传递给.reduce时,可以确保累加器始终是数字。如果您只想获取最大数目,出于完整性考虑,这是另一种方法:

const max = arr.reduce((a, b) => Math.max(a, b.number), -Infinity);

我还是宁愿使用@ntgwsth解决方案来获得更大的灵活性。

答案 3 :(得分:0)

您的想法正确。这是一个使用reduce的解决方案,并且将制表符放在数组中排名最高的对象上:

var nameNum = [
    {number: 1000, name: "Josh"},
    {number: 2000, name: "Joker"},
    {number: 3000, name: "Batman"}
];
console.log(nameNum.reduce(function(max,current){return current.number>max.number?current:max;},{number:-Infinity, name:""}));

答案 4 :(得分:0)

如果您真的想将Math.max()用作reduce回调的一部分,请参考以下示例: 您可以为选项创建一个模拟哈希图,然后使用Math.max()选择合适的哈希图。 另外,请记住将初始的-Inf对象用于第一次比较。

[
    {number: 1000, name: 'Josh'},
    {number: 2000, name: 'Joker'},
    {number: 3000, name: 'Batman'},
].reduce((max, current) => {
    return {
        [max.number]: max,
        [current.number]: current,
    }[Math.max(max.number, current.number)];
}, {number: -Infinity});