我有一个对象数组。我想从数组的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"}
如何通过减少实现呢?似乎它仅适用于数字数组。
答案 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});