在double for循环中将项添加到不同的对象 - Javascript

时间:2015-11-17 17:23:28

标签: javascript json for-loop

尝试解释会让人感到困惑,但我希望能够将技能组列表添加到自己列表中的不同人物对象中。

例如: 我有一个人的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};
      }
   });
});

但它会多次重复一个人而不是添加到他们自己的技能列表中。

3 个答案:

答案 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);