2016-03-15 4 views
0

У меня есть массив объектов, пример объекта:Наибольшее значение в массиве (значение атрибута в объекте массива)

$scope.object = { 
    Title: 'object1', 
    Description: 'lorem ipsum', 
    Value: 123 
}; 

Так что мой массив будет состоять из нескольких объектов с этими атрибутами, как может Я нахожу объект с самым высоким «значением» в моем массиве?

Я рассмотрел другие вопросы, like this, но они о массивах с чистыми значениями в них, а не объектами.

Что я действительно хочу, чтобы найти объект с наибольшим значением внутри моей HTML, может быть, с помощью angular $filter, что-то вроде этого:

ng-repeat="item in objectArray | filter: filterHere " 

Но это также будет работать с функцией, прямо сейчас сделать это так, но мне не нравится это решение вообще:

var value = 0; 
angular.forEach($scope.objectArray, function(object){ 
    if(object.Value > value){ 
     value = object.Value; 
     $scope.itemToSeeInView = object; 
    } 
}); 

Таким образом, если значение объекта больше, чем var value пункта, чтобы увидеть в виду настроен на этот объект, если $ фильтра в представлении не будет работать, может ли эта функция быть улучшена?

+0

Хотите ли вы решить эту проблему в контроллере или в шаблоне. Оба варианта возможны. –

+0

Я бы хотел, чтобы это было разрешено в шаблоне, но было бы нормально решить в контроллере, если это необходимо – klskl

+0

Хорошо, значения всегда положительные? –

ответ

2

Если вы хотите отобразить только мин/макс из массива, вы можете использовать OrderBy фильтр, и объединить его с limitTo фильтром. что будет выглядеть примерно так:

<tr ng-repeat="p in vm.persons | orderBy:'someValue' |limitTo:1" > 

или в случае Вашего собственного примера

ng-repeat="item in objectArray | orderBy:'Value': true | limitTo:1" 

я создал a small plnkr, так что вы можете увидеть это в действии. Плунжер - это расширенная версия того, что я описал выше, и давайте вам переключить некоторые из вещей. Бросьте мне записку, если я слишком много вложил. Я починю его соответственно.

+0

Это работает, и я, вероятно, пойду с этим решением, но! Я получаю ту же проблему, что и я, с ответом выше, почему-то это говорит о том, что 42 выше 135, почему это может быть? – klskl

+0

Вы уверены, что ваши значения являются номерами, а не строками? он работает как ожидалось в моей выборке. –

+0

С другой стороны, это могло измениться между угловыми версиями. В какой версии вы работаете? –

2

Вы можете использовать встроенный метод сортировки

$scope.objectArray.sort(function(a,b) { return a.Value < b.Value})[0] 
+0

Это работает, но это не в html (будет искать другие решения, но очень полезно, спасибо) – klskl

+0

У меня проблема с этим, похоже, если значение более 100, это может быть неправильно, просто сказано 42 было выше 135 .. что-то с INT или float или что вы думаете? – klskl

+0

Содержит строку или номер? –

0

Я боюсь, что если вы можете получить оптимизированное решение с $ фильтром, но здесь это быстрое решение.

$scope.friends = [ 
    {name:'John', age:25}, 
    {name:'Mary', age:35}, 
    {name:'Mike', age:18}, 
    {name:'Adam', age:35}, 
    {name:'Julie', age:23} 
]; 

var arr = []; 
angular.forEach($scope.friends, function(item) { 
    arr.push(item["age"]); 
}); 
$scope.result = arr.sort().reverse()[0]; // Highest value. 

jsfiddle Demo

0

При использовании ES6 (с transpiler), вы можете использовать этот код:

const friends = [ 
    {name:'John', age:25}, 
    {name:'Mary', age:35}, 
    {name:'Mike', age:18}, 
    {name:'Adam', age:35}, 
    {name:'Julie', age:23} 
]; 

const maxObject = friends.find(friend => !friends.some(item => item.age > friend.age)); 
Смежные вопросы