2015-12-07 3 views
0

У меня есть массив и я ищу самое большое возрастное значение с key, но после того, как я нашел его, мне нужно найти следующий, исключив родителя первого из поиска. Вот массив и функции Пример:Найти следующее самое большое значение в массиве

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

// Function 
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; 

       } 

      }); 
     } 
    } 
}); 

Так на основе этого примера мне нужно получить 24 от female. Пожалуйста, дайте мне несколько советов.

JSFIDDLE

+0

- это отсортированные по алфавиту массивы? или случайным позиционированием? – Rohan210

+0

Что вы подразумеваете под «исключить родителя»? –

+0

@ Rohan210 Случайные. –

ответ

0

В вашем состоянии вы можете проверить женщина только объект.

var maxFemaleAge = 0; 

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

Это покажет максимальный возраст женщины в консоли. Fiddle

+0

Whay 'key === 'female''? Что такое больше массивов? –

+0

@AnandG спросил хороший вопрос, это на самом деле мое дело, у меня есть более двух массивов. У меня есть 'female_two, female_three, male_two, ...' и т. Д. –

0

Обычно вы найдете максимум для каждого ключа таким образом:

var max = {} 
...//for each key 
max[key] = 0 
...//for each val 
if(val > max[key]){ 
    max[key] = val 
} 
... 
+0

Что делать, если у меня есть около 50 массивов, таких как 'female_two, ..., male_two, ...' и т. Д.? Мне нужно использовать 50 варов? –

+0

@samuelk: обновлено –

+0

Спасибо. Можете ли вы, пожалуйста, обновить мою [скрипку] (http://jsfiddle.net/yhb9488b/) своим решением? –

0

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

var ages = data["people"].reduce(function(prev, item) { 
    var max = 0; 
    for (var key in item) { 
     if (item.hasOwnProperty(key)) { 
      item[key].forEach(function(person) { 
       if (person.age > max) { 
        max = person.age; 
       } 
      }); 
     } 
     prev.push(max); 
     return prev; 
    } 
}, []); 

console.log(ages); // 32, 24 
0

Если в вашем объекте не так много элементов, вы также можете использовать сортировку, как здесь: Sorting an array of JavaScript objects На данный момент структура вашего объекта не является оптимальным для этого подхода. На первом этапе вы должны принести записи в итерируемую структуру. Например:

var persons = [ 
    {"name": "Bob", "age": "32", "sex": "male"}, 
    {"name": "Jessica", "age": "24", "sex": "female"}, 
    {...}]; 

Когда ваши данные выглядят так, что с ним намного проще работать.

Вы можете сортировать людей очень легко:

persons.sort(function(a,b){return b.age - a.age}) 

Если вы хотите сделать что-то более сложное можно также использовать метод карты:

females = persons.map(function(a){if (a.sex ==="female"){return a}}); 

Когда вы объедините, что два метода, вы могли бы очень легко становятся самыми старыми самками или мужчинами.

Это решение гораздо более «JavaScript». Это не много кода, легко читается и использует сборку в JS-методах.

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