2015-11-05 98 views
1

我試圖合併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

回答

2

,你可以這樣做:

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

1

與您的代碼的問題是,一旦你遍歷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

1

有很多策略可以做到這一點。但最重要的是你應該分別迭代每個數組。我會使用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();文檔。

相關問題