2015-12-07 2 views
0

У меня есть вложенный массив, который я хочу, чтобы восстановить на основе возрастного значения:Rebuild вложенного массива

//Data 
data = {"people": 
    [{"male_1": [ 
    {"name": "Bob" ,"age": "32"}, 
    {"name":"Mike", "age":"31"} 
    ]}, 
    {"female_2": [ 
    {"name":"Jessica", "age": "24"}, 
    {"name":"Ann", "age": "23"} 
    ]} 
    [{"male_3": [ 
    {"name": "Tom" ,"age": "31"}, 
    {"name":"John", "age":"29"} 
    ]}, ... 
    ]} 

Нового массив выглядит следующим образом:

people = [{"male_1": [ 
     {"name": "Bob" ,"age": "32"} 
    ]}, 
    [{"male_3": [ 
     {"name": "Tom" ,"age": "31"} 
    ]}, 
    {"female_2": [ 
    {"name":"Jessica", "age": "24"} 
    ]}, ... 
    ]} 

Основываясь на этом примере я должен найти самый большой возраст всех «лиц», затем добавьте этого человека в массив, затем выполните то же самое со следующим. Возраст может быть таким же, в этом случае нет разницы, кто идет первым.

С помощью следующей функции я могу найти первый и нажать на новый массив, но как найти следующий?

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; 
        oldest_person = person 

       } 

      }); 
     } 
    } 
}); 
console.log(oldest_person); 
+0

ли вы рассмотреть вопрос об использовании углам главного [OrderBy] (https://docs.angularjs.org/api/ng/filter/orderBy)? –

+0

Вы имели в виду пользовательский фильтр? Мне нужно перестроить его внутри контроллера не внутри 'ng-repeat' –

ответ

0

Попробуйте это:

var age = 0; 
var oldest_person = []; 
var data = {"people": 
    [ 
    {"male_1": [ 
    {"name": "Bob" ,"age": "32"}, 
    {"name":"Mike", "age":"31"} 
    ]}, 
    {"female_2": [ 
    {"name":"Jessica", "age": "24"}, 
    {"name":"Ann", "age": "23"} 
    ]}, 
    {"male_3": [ 
    {"name": "Tom" ,"age": "31"}, 
    {"name":"John", "age":"29"} 
    ]} 
]}; 

data["people"].forEach(function(item) { 
    for (var key in item) { 
     if (item.hasOwnProperty(key)) { 
      var age = 0; 
      var name = key; 
      var oldest = null; 
      item[key].forEach(function(person) { 
       // Determine the oldest person in each group ("male_1", "female_2", "male_3", ...) 
       if (person.age > age) { 
        age = person.age; 
        oldest = person; 
       } 
      }); 
      // Push the oldest person into the 'oldest_person' array 
      var group = {}; 
      group[name] = [ oldest ]; 
      oldest_person.push(group); 
     } 
    } 
}); 

console.log(oldest_person); 
0

Вы можете использовать некоторые Array методы, такие как Array.prototype.forEach(), Array.prototype.reduce() и Object.keys().

var data = { "people": [{ "male_1": [{ "name": "Bob", "age": "32" }, { "name": "Mike", "age": "31" }] }, { "female_2": [{ "name": "Jessica", "age": "24" }, { "name": "Ann", "age": "23" }] }, { "male_3": [{ "name": "Tom", "age": "31" }, { "name": "John", "age": "29" }] }] }, 
 
    people = []; 
 
data.people.forEach(function (a) { 
 
    Object.keys(a).forEach(function (k) { 
 
     var o = {}; 
 
     o[k] = a[k].reduce(function (c, d) { 
 
      return c.age > d.age ? c : d; 
 
     }); 
 
     people.push(o); 
 
    }); 
 
}); 
 
document.write('<pre>' + JSON.stringify(people, 0, 4) + '</pre>');

1

здесь другая интерпретация. В качестве вспомогательной функции используется родной Array.prototype.sort.

var data = { "people": [{ "male_1": [{ "name": "Bob", "age": "32" }, { "name": "Mike", "age": "31" }] }, { "female_2": [{ "name": "Jessica", "age": "24" }, { "name": "Ann", "age": "23" }] }, { "male_3": [{ "name": "Tom", "age": "31" }, { "name": "John", "age": "29" }] }] }, 
 
\t oldies = [], 
 
\t peopleByAge = data.people.map(function(group){ 
 

 
\t for(var name in group){ 
 
\t \t group[name] = group[name].sort(sortBy('age')); 
 
\t \t oldies.push(group[name][0]); 
 
\t } 
 

 
\t return group; 
 
}); 
 
// sort by an object key 
 
function sortBy(key){ 
 
\t return function(a, b){ 
 
\t \t return parseInt(a[ key ]) < parseInt(b[ key ]); 
 
\t } 
 
} 
 

 
document.write('<pre>' + JSON.stringify({ oldies: oldies.sort(sortBy('age')), peopleByAge: peopleByAge }, 0, 2) + '</pre>');

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