我有一系列对象,如:
var myArr = [{
number: 5,
shouldBeCounted: true
}, {
number: 6,
shouldBeCounted: true
}, {
number: 7,
shouldBeCounted: false
}, ...];
如何找到number
设置为shouldBeCounted
的对象的最大true
?我不想使用循环,只是想知道这是否可以Math.max.apply
(或类似的东西)。
答案 0 :(得分:5)
不,这是不可能的。您可以将Math.max
与.map
一样使用
var myArr = [{
number: 5,
shouldBeCounted: true
}, {
number: 6,
shouldBeCounted: true
}, {
number: 7,
shouldBeCounted: false
}];
var max = Math.max.apply(Math, myArr.map(function (el) {
if (el.shouldBeCounted) {
return el.number;
}
return -Infinity;
}));
console.log(max);
答案 1 :(得分:2)
使用简单的.reduce()
:
var myArr = [{
number: 5,
shouldBeCounted: true
}, {
number: 6,
shouldBeCounted: true
}, {
number: 7,
shouldBeCounted: false
}];
var max = myArr.reduce(function(max, current) {
return current.shouldBeCounted ? Math.max(max, current.number) : max;
}, -Infinity);
console.log(max);

其中
myArr.reduce()
- 将数组缩减为单个值。接受具有两个参数的函数,当前累积值和当前项(还有两个可选参数,用于项的索引和原始数组)。return current.shouldBeCounted ? Math.max(max, current.number) : max;
- 对于每个项目,返回当前最大值为shouldBeCounted为false,或当前已知最大值与当前数量之间的最大值。, -Infinit
- 从-Infinity
开始。这种方法相对于已接受答案中的方法的优点是,这只会迭代数组一次,而.filter()
和.map()
在数组上循环一次。
答案 2 :(得分:1)
另一个不那么详细的解决方案(如果你的数字都是正数):
var max = Math.max.apply(Math, myArr.map(function(el) {
return el.number*el.shouldBeCounted;
}));
答案 3 :(得分:0)
你不能。除非在添加到数组之前将最大数量存储在变量中,否则所有解决方案都需要遍历数组。
答案 4 :(得分:0)
如果你只需要获取号码,那么你可以试试:
let myArr = [
{ number: 5, shouldBeCounted: true},
{ number: 6, shouldBeCounted: true},
{ number: 7, shouldBeCounted: false}
];
function maxNum(mArr) {
return Math.max(...mArr.filter(a => a.shouldBeCounted ).map( o => o.number))
}
console.log(maxNum(myArr))