在双for循环中向不同对象添加项-Javascript

Adding items to different objects in a double for loop - Javascript

本文关键字:对象 添加 -Javascript for 循环 在双      更新时间:2023-09-26

尝试解释起来很困惑,但我希望能够将技能集列表添加到不同列表中的人员对象中。

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

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

您需要一个数组类型来存储多个技能,因此与其只分配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);
      }
   });
});

如果你有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测试证明。

您在每次迭代中都覆盖技能(本部分: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);