[英]Finding object in nested collection with Underscore.js
我有一个联赛中的球队集合,如下所示:
var fra1 = {
"sports":[
{
"name":"soccer",
"id":600,
"uid":"s:600",
"leagues":[
{
"name":"French Ligue 1",
"abbreviation":"fra.1",
"id":710,
"isTournament":false,
"country":{
"id":7,
"name":"France",
"abbreviation":"FRA"
},
"uid":"s:600~l:710",
"groupId":9,
"shortName":"Ligue 1",
"teams":[
{
"id":159,
"uid":"s:600~t:159",
"location":"Bordeaux",
"name":"Bordeaux",
"nickname":"Bordeaux",
"abbreviation":"BOR",
"color":"00003e",
},
{
"id":160,
"uid":"s:600~t:160",
"location":"Paris Saint-Germain ",
"name":"Paris Saint-Germain ",
"nickname":"Paris Saint-Germain ",
"abbreviation":"PSG",
"color":"000040",
}
]
}
]
}
],
}
以这种方式存储的每个变量中大约有20个团队。 然后,我大约有六个这样的联赛: eng1
, esp1
, fra1
, ger1
, ita1
和usa1
。 我将它们放在另一个集合中,如下所示:
var all = {
"eng1":eng1,
"esp1":esp1,
"fra1":fra1,
"ger1":ger1,
"ita1":ita1,
"usa1":usa1
}
现在,每个球队(无论他们身在哪个联赛中)都具有唯一的ID:在上面的示例中,波尔多的ID为159,PSG的ID为160,依此类推。 因此,我希望能够使用teamid
通过teamid
在all
集合中搜索一个唯一的团队,但是我不太了解语法。 我知道我可以这样搜索一个联赛:
var obj = _.find(fra1.sports[0].leagues[0].teams, function(obj) { return obj.id == teamid })
但我不知道在所有六个联盟中如何做到这一点。 有人可以帮忙吗? 我不想不必将集合手动合并为一个集合,因为这样做会涉及到大量数据。
编辑:我当前正在使用:
for (var league in all)
{
var obj = _.find(all[league].sports[0].leagues[0].teams, function(obj) { return obj.id == teamid })
if (obj !== undefined)
{
// do things
}
}
但是仍然想要更好的东西。
一种解决方案是创建一个以团队ID为键,团队为值的团队图:
var teams = {};
_.each(all, function(nation){
_.each(nation.sports[0].leagues[0].teams, function(team){
teams[team.id] = team;
});
});
然后,您可以使用以下密钥访问团队:
var psg = teams[160];
至于解析其余团队,只需使用链:
var allTeams = _.chain(all)
.values()
.pluck('sports').flatten() // once
.pluck('leagues').flatten() // twice
.pluck('teams').flatten() // third time's a charm
.value()
我建议在teamID上使用_.groupBy()。 这将为您提供一个映射teamID -> teamObject
的哈希表(JS对象)。 假设您的团队是这样解析的:
var allTeams =[
{
"id":159,
"uid":"s:600~t:159",
"location":"Bordeaux",
"name":"Bordeaux",
"nickname":"Bordeaux",
"abbreviation":"BOR",
"color":"00003e",
},{
"id":160,
"uid":"s:600~t:160",
"location":"Paris Saint-Germain ",
"name":"Paris Saint-Germain ",
"nickname":"Paris Saint-Germain ",
"abbreviation":"PSG",
"color":"000040",
}]
您可以将它们分组:
var lookup = _.groupBy(teams, 'id')
然后查找一个像这样的团队:
var myTeam = lookup[teamId]
只需在sports
和leagues
进行附加循环,而不仅限于all
循环:
for (var league in all) {
var sports = all[league];
for (var i=0; i<sports.length; i++) {
var leagues = sports[i].leagues;
for (var j=0; j<leagues.length; j++) {
var teams = leagues[j].teams;
// var obj = _.find(teams, function(obj) { return obj.id == teamid })
for (var k=0; k<teams.length; k++) {
var obj = teams[k];
if (obj.id == teamid) {
… // do things
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.