2016-01-12 2 views
3

Я хочу, чтобы выбрать самое большое число в массиве объектов, так, например, я хочу, чтобы получить x собственность, которая держит наибольшее число (в данном примере, maximum должен быть 200):Как использовать Math.max с массивом объектов?

var myArr = [{x:100,y:200),{x:200,y:500}]; 

//does not work: 
var maximum = Math.max.apply(Math,myArr.x); 

ответ

12

Вы должны извлечь свойства из объектов себя:

var maximum = Math.max.apply(Math, myArr.map(function(o) { return o.x; })); 

Это использует .map() для перебора элементов массива и возвращает значение свойства «х». Затем этот массив результатов передается как аргументы Math.max().

+0

Это было давно и, очевидно, тогда Я принял ответ, который я понял легче (тот, который был принят прямо сейчас), но из числа повышений видно, что ваше решение является предпочтительным. Не могли бы вы объяснить, почему? – Taurus

+0

@Taurus well Я бы предположил, что это потому, что это намного более красноречиво. Однако это не делает ничего принципиально другого. – Pointy

0

Вы должны map массив объектов в массив чисел:

Math.max.apply(Math,myArr.map(function(o){return o.x;})) 
+0

делает o стоящим за объект или независимым от меня, чтобы изменить «o»? – Taurus

+0

Это просто имя аргумента. Измените его на то, что вы хотите, – Andy

0
var myArr = [{x:100,y:200},{x:200,y:500}]; 

function sortByKeyDesc(array, key) { 
    return array.sort(function(a, b) { 
     var x = a[key]; var y = b[key]; 
     return ((x < y) ? 1 : ((x > y) ? -1 : 0)); 
    }); 
} 
console.log(sortByKeyDesc(myArr, "x")[0].x); 

первый sort by key value в порядке убывания, а затем получить x свойство первого объекта

+0

«Как альтернатива использованию« Math.max »... :) – Andy

+0

@ Andy да, я имею в виду только как альтернативу :) также будет работать, если значения не являются числом (на всякий случай) – gurvinder372

1

Если вы хотите, чтобы это сделать старомодным способом:

function arrayMax(arr, key){ 
    var m = -Infinity, 
     cur, 
     i; 
    for(i=0; i<arr.length; i++){ 
     cur = arr[i][key] 
     if(cur > m){ 
      m = cur; 
     } 
    } 
    return m; 
} 

Эта функция принимает массив объектов в качестве первого аргумента, а ключ - второй. Он выполняет итерацию по массиву и возвращает наибольшее значение, найденное для данного ключа.

В вашем случае, вы могли бы назвать это так:

var maximum = arrayMax(myArr, "x"); 

Обратите внимание, что, в отличие от Math.max, это устойчивость к случаю, когда один (или более) объектов не имеет этот ключ определены, так что:

arrayMax([{y:200}, {x:100, y:100}, {x:300, y:400}], "x"); 

вернется 300, в то время как Math.max возвращается NaN (на Google Chrome, по крайней мере). Худший сценарий (ни один из объектов не имеет ключа), функция arrayMax возвращает -Infintity.

Если вы хотите, чтобы вернуть объект, который имеет наибольшее значение, вместо того, чтобы просто возвращая значение, вы можете легко изменить функцию сделать так:

function arrayMax(arr, key){ 
    var m = -Infinity, 
     o = null, 
     cur, 
     curv, 
     i; 
    for(i=0; i<arr.length; i++){ 
     cur = arr[i] 
     curv = cur[key] 
     if(curv > m){ 
      m = curv; 
      o = cur; 
     } 
    } 
    return o; 
}