按阵列Underscore JS过滤数组

时间:2015-07-23 08:11:58

标签: javascript jquery underscore.js

我正在尝试根据多选(Bootstrap Multiselect to be precise)中选中的复选框,通过TeamID筛选出“玩家”,这是一个数组。

我有它的工作,但要求发生了变化,玩家可以在多个团队中。 (对不起,我没有JSFiddle / CodePen,Bootstrap Multiselect没有CDN,而且两者都不好玩)

这是我为个人团队所做的工作。

var temp = [];

_.each(selected, function(i){
            temp.push(_.filter(allPlayers, function(obj){
                return obj.TeamID == i;
            }));
});

但是我需要通过数组过滤数组。

JSON

var allPlayers = [{
     "TeamID": [100001, 100002],
     "PlayerID": 1,
     "PlayerName" : "Pete Tong"
    },
    {
     "TeamID": [100001, 100002],
     "PlayerID": 2,
     "PlayerName" : "Will Chamberlain"
    },
    {
     "TeamID": [100002, 100003],
     "PlayerID": 3,
     "PlayerName" : "Jane Doe"
    },
    {
     "TeamID": [100004],
     "PlayerID": 4,
     "PlayerName" : "John Doe"
}];

我试过了 Filter two different structured arrays underscore js但它似乎不适用于我的解决方案。

所选数组

 var teams = $('#team-list option:selected');
 var selected = [];

 $(teams).each(function(index, team){
        selected.push($(this).val());
 });

2 个答案:

答案 0 :(得分:1)

这应该有效:

var temp = [];

_.each(selected, function(i){
            temp.push(_.filter(allPlayers, function(obj){
                return obj.TeamID.indexOf(i) !== -1;
            }));
});

您可以检查TeamID数组是否包含所选的ID,而不是比较TeamID是否等于所选的ID。

答案 1 :(得分:1)

如果使用filter(),则不需要额外的外部变量:

var allPlayers = [{
     "TeamID": [100001, 100002],
     "PlayerID": 1,
     "PlayerName" : "Pete Tong"
    },
    {
     "TeamID": [100001, 100002],
     "PlayerID": 2,
     "PlayerName" : "Will Chamberlain"
    },
    {
     "TeamID": [100002, 100003],
     "PlayerID": 3,
     "PlayerName" : "Jane Doe"
    },
    {
     "TeamID": [100004],
     "PlayerID": 4,
     "PlayerName" : "John Doe"
}];



var selected=[100003, 100004]; // change this 

var filtered= allPlayers.filter(function(a){
    return selected.some(function(team){
      return a.TeamID.indexOf(team)!==-1;
    });
});

alert(JSON.stringify(filtered, null, "\t"));

演示:http://pagedemos.com/qejbsz722hs3/2

编辑:添加了多对多的搜索。