比较值,并添加如果匹配到一个数组

问题描述:

我试图合并2个数据源在1,我想通过它们循环,如果specefic值匹配比添加到第一个对象具有相同的值,并添加在emty数组已经存在。不管我有多少物体。比较值,并添加如果匹配到一个数组

所以可以说我有这个信息

源1

one = { 
    "teams": [ 
     { 
      name: 'ABC', 
      members: [], 
      rooms: '0' 
     }, 
     { 
      name: 'DEF', 
      members: [], 
      rooms: '1' 
     } 
    ] 
} 

源2

two = { 
    "persons": [ 
     { 
      name: 'Foo', 
      gender: 'male', 
      room: '1' 
     }, 
     { 
      name: 'Bar', 
      gender: 'female', 
      room: '2' 
     } 
    ] 
} 

而我想的是,“人”阵列合并到成员数组,如果'房间和房间'的价值相匹配。

我会承担什么是类似这样的:

for(var i = 0 ; i < two.persons.length; i++) { 
    if (one.teams[i].rooms == two.persons[i].room) { 
      data.teams[i].members.push(two.persons[i]); 
     } 
} 
+0

你需要至少两个独立的循环 –

+0

哪里需要另一个循环,在那个已经存在的循环中? – Dennis

+0

@ DennisWegereef类似[this](http://jsfiddle.net/danield770/zf15qdvL/)(看看控制台输出) – Danield

,你可以这样做:

one = { 
 
    "teams": [ 
 
     { 
 
      name: 'ABC', 
 
      members: [], 
 
      rooms: '0' 
 
     }, 
 
     { 
 
      name: 'DEF', 
 
      members: [], 
 
      rooms: '1' 
 
     } 
 
    ] 
 
}; 
 

 
two = { 
 
    "persons": [ 
 
     { 
 
      name: 'Foo', 
 
      gender: 'male', 
 
      room: '1' 
 
     }, 
 
     { 
 
      name: 'Bar', 
 
      gender: 'female', 
 
      room: '2' 
 
     } 
 
    ] 
 
}; 
 

 
var ttt = one.teams.map(function(x){ 
 
var roomVal= x.rooms; 
 
    
 
    x.members = two.persons.filter(function(t){ 
 
     return t.room == roomVal}); 
 
    return x; 
 
}) 
 

 
one.teams = ttt; 
 
console.log(one)

+0

作品完美的我想要的 – Dennis

与您的代码的问题是,一旦你遍历two阵列,那么你不回去,看看前面的元素与匹配目前的一个。

例如,如果[0]每个阵列不匹配,你在for循环遍历索引[1],你没有办法检查是否two[1]匹配one[0]

做一个完整的搜索,你可以直接遍历数组为two每个值:使用高阶方法

two.persons.forEach(function(person) { 
    one.teams.forEach(function(team) { 
     if (team.rooms == person.room) { 
      team.members.push(person); 
     } 
    }); 
}); 
+0

感谢您的解释,完美的作品 – Dennis

有很多策略可以做到这一点。但最重要的是你应该分别迭代每个数组。我会使用Array.forEach();

one.teams.forEach(function (team, teamsIndex, teamsArray) { 
    two.persons.forEach(function (person, personsIndex, personsArray) { 
    if (team.room == person.room) { 
     // Do what you need to do. 
    } 
    }); 
}); 

未检查语法,因此请注意阅读Array.forEach();文档。