2015-12-03 4 views
1

Мне нужна функция, которая будет искать/фильтровать наибольшее значение во вложенном массиве и затем возвращать родительскую область.Угловой: как искать в вложенном массиве?

Мой массив выглядит следующий:

data = {"people": 
    [{"male": [ 
    {"name": "Bob" ,"age": "32"}, 
    {"name":"Mike", "age":"22"} 
    ]}, 
    {"female": [ 
    {"name":"Jessica", "age": "24"}, 
    {"name":"Ann", "age": "23"} 
    ]}]} 

И мне нужно, чтобы найти самое большое значение возраста из всех людей, а затем вернуться обратно мужской или женский массив (в примере это мужской массив)

С помощью JavaScript Я могу использовать что-то вроде:

largest = array.reduce((x, y) -> 
     if x > y then x else y 
    ) 
    console.log largest 

но как это можно реализовать для вложенного массива?

Или есть способ использования угловых $filter?

+0

Это не вложенный массив, который вы используете. это объект, у которого есть некоторые свойства, причем их значения являются массивом. – lexith

ответ

0

Вы можете увидеть здесь, как искать вложенный объект: Find by key deep in a nested object

Тогда вы можете просто перебрать все элементы в массиве их поиск.

Я бы предложил несколько иной подход, если вы можете гарантировать структуру своего массива и те вложенные объекты. Сначала вы проходите через массив (мужчина/женщина), и для каждого из них вы пробираетесь через людей и находите их возраст. Это не точный код, но что-то из подобных:

var age = 0; 
data["people"].forEach(function(item) { 
    for (var key in item) { 
     if (item.hasOwnProperty(key)) { 
      item[key].forEach(function(person) { 
       if (person.age > age) { 
        age = person.age; 
       } 
      }); 
     } 
    } 
}); 
console.log(age); 
+0

Спасибо за это, отлично работает. Основываясь на этом примере, каков наилучший способ найти следующее наибольшее возрастное значение (в моем примере данных это будет «возраст»: «24»)? –

+0

Сверху моей головы, после обнаружения самого большого возраста - удалите этого человека из списка и заново запустите функцию. Вероятно, это решение наименьшего кода, но не очень эффективное. Если вы потенциально работаете с десятками тысяч пользователей, вам просто нужно иметь переменные age1 и age2 и обновлять их последовательно. – AlexD

0

Это уродливое представление данных, но все равно:

var data = {"people": 
    [{"male": [ 
    {"name": "Bob" ,"age": "32"}, 
    {"name":"Mike", "age":"22"} 
    ]}, 
    {"female": [ 
    {"name":"Jessica", "age": "24"}, 
    {"name":"Ann", "age": "23"} 
    ]}]}; 

function getMaxAge(array) { 
    var max = 0; 
    array.forEach(function(people) { 
    if (people.age > max) max = people.age; 
    }) 
    return max; 
} 

var max = 0; 
var arrayWithMax; 
for (var i = 0; i < data.people.length; i++) { 
    var array = data.people[i][Object.keys(data.people[i])[0]]; 
    var currentMax = getMaxAge(array); 
    if (currentMax > max) { 
    max = currentMax; 
    arrayWithMax = array; 
    } 
} 

console.log('max age: ' + max) 
console.log(arrayWithMax); 

Смотрите этот код работает в https://jsfiddle.net/ave5hcLu/

Я предполагаю, что ваши данные структура фиксирована

Смежные вопросы