重建嵌套数组

时间:2015-12-07 14:22:57

标签: javascript angularjs

我有一个嵌套数组,我想根据年龄值重建:

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

3 个答案:

答案 0 :(得分: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" }] }] },
	oldies = [],
	peopleByAge = data.people.map(function(group){

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

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

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

答案 1 :(得分: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);

答案 2 :(得分:0)

您可以使用一些Array方法,例如Array.prototype.forEach()Array.prototype.reduce()Object.keys()

&#13;
&#13;
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>');
&#13;
&#13;
&#13;