尝试解释会让人感到困惑,但我希望能够将技能组列表添加到自己列表中的不同人物对象中。
例如: 我有一个人的Json对象:
"people": [
{
"id": 1,
"name": "Tony Rogers",
},
{
"id": 2,
"name": "Steven Grant",
},
{
"id": 3,
"name": "Peter Wilson",
},
]
然后我有一份我希望与之匹配的技能列表:
"skills": [
{
"id": 1,
"name": "Engineering",
"personId": 1
},
{
"id": 2,
"name": "Painting",
"personId": 2
},
{
"id": 3,
"name": "Chemistry",
"personId": 3
},
{
"id": 4,
"name": "Physics",
"personId": 1
},
]
但我不确定如何通过循环遍历两个列表来获得我想要的输出。我最好在每个包含他们所有技能的人身上附加一个“技能”部分。
我以为我可以按照
的方式做点什么people.forEach(function(person){
skills.forEach(function(skill){
if(skill.personId == person.id){
person['skills'] = {"name" : skill.name};
}
});
});
但它会多次重复一个人而不是添加到他们自己的技能列表中。
答案 0 :(得分:1)
你需要一个数组类型来存储多种技能,所以不要只是分配person['skills'] = {"name" : skill.name};
而是创建一个数组并将新的技能对象推送到它。
people.forEach(function(person){
skills.forEach(function(skill){
if(skill.personId == person.id){
//creates an array, if not yet created
person['skills'] = person['skills'] || [];
//push the skill object to the array
person['skills'].push(skill.name);
}
});
});
答案 1 :(得分:1)
如果你有20个人和20个技能,那么它将是20 * 20 = 400个循环!
只需使用2个循环就可以更有效地完成任务:
var skillsByPerson = {};
skills.forEach(function(skill) {
var personId = skill.personId;
var personSkills = skillsByPerson[personId] || (skillsByPerson[personId] = []);
personSkills.push({ name: skill.name });
});
people.forEach(function(person) {
person.skills = skillsByPerson[person.id] || [];
});
以下是jsPerf性能检查的测试证明。
答案 2 :(得分:0)
你在每次迭代时都会覆盖技能(这部分:person['skills'] = {"name" : skill.name};
),而你需要将技能推向一系列技能:
var people = [
{"id": 1, "name": "Tony Rogers",},
{"id": 2, "name": "Steven Grant",},
{"id": 3, "name": "Peter Wilson",}];
var skills = [{
"id": 1,
"name": "Engineering",
"personId": 1
}, {
"id": 2,
"name": "Painting",
"personId": 2
}, {
"id": 3,
"name": "Chemistry",
"personId": 3
}, {
"id": 4,
"name": "Physics",
"personId": 1
}, ]
people.forEach(function(person) {
person['skills'] = []; // create an empty skills array for each person
skills.forEach(function(skill) {
if (skill.personId == person.id) {
person['skills'].push({"name": skill.name}); // push the skill
}
});
});
console.log(people);