繁体   English   中英

使用Underscore.js在嵌套集合中查找对象

[英]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个团队。 然后,我大约有六个这样的联赛: eng1esp1fra1ger1ita1usa1 我将它们放在另一个集合中,如下所示:

var all = {
    "eng1":eng1,
    "esp1":esp1,
    "fra1":fra1,
    "ger1":ger1,
    "ita1":ita1,
    "usa1":usa1
}

现在,每个球队(无论他们身在哪个联赛中)都具有唯一的ID:在上面的示例中,波尔多的ID为159,PSG的ID为160,依此类推。 因此,我希望能够使用teamid通过teamidall集合中搜索一个唯一的团队,但是我不太了解语法。 我知道我可以这样搜索一个联赛:

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]

只需在sportsleagues进行附加循环,而不仅限于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM