获取JS中用于过滤的对象数组的最大值

时间:2015-05-05 13:40:44

标签: javascript arrays

我有一系列对象,如:

var myArr = [{
    number: 5,
    shouldBeCounted: true
}, {
    number: 6,
    shouldBeCounted: true
}, {
    number: 7,
    shouldBeCounted: false
}, ...];

如何找到number设置为shouldBeCounted的对象的最大true?我不想使用循环,只是想知道这是否可以Math.max.apply(或类似的东西)。

5 个答案:

答案 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))