2015-05-05 2 views
0

У меня есть массив объектов, как:Получить максимальное значение в JS для фильтрованного массива объектов

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

Как найти максимальный number для объектов с shouldBeCounted набором для true? Я не хочу использовать циклы, просто интересно, возможно ли это с Math.max.apply (или что-то в этом роде).

+1

Нет, это не возможно. Вы можете 'Math.max' с' .map', как это http://jsfiddle.net/nqx7ghzx/ –

+1

@Alexander И вы пишете это в комментарии вместо ответа ... потому что? –

+1

Что делать, если все элементы имеют 'shouldBeCounted'' false' – thefourtheye

ответ

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);

0

Вы не можете. Для всех решений требуется пройти массив, если вы не будете хранить максимальное число в переменной перед добавлением в массив.

+0

Вы мне грустно :(спасибо за ответ – Nickon

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; - Для каждого элемента возвращается текущий максимум, значение должно быть обязательным, а false - максимальное значение между текущим известным максимумом и текущим номером.
  • , -Infinit - Начиная с -Infinity.

Преимущество такого подхода по сравнению с одной в принятом ответ, что это будет только перебирать массив один раз, в то время как .filter() и .map() цикл по массиву каждый раз. не

+0

@SalmanA Хорошая точка! –

+0

Если все числа отрицательные, это возвращает '5e-324' (как ни странно). Замена' Number.MIN_VALUE' исправления '-Infinity' это –

+1

@RickHitchcock Вы правы! Исправлено. –

1

Еще менее многословным решение (если ваши номера положительны):

var max = Math.max.apply(Math, myArr.map(function(el) { 
    return el.number*el.shouldBeCounted; 
}));