按数组过滤数组 Underscore JS

Filter array by array Underscore JS

我正在尝试通过他们的 TeamID 过滤掉 "Players",这是一个数组,基于多 select 中的 selected 复选框(Bootstrap Multiselect to be precise ).

我让它工作了,但要求改变了,玩家可以在多个团队中。 (对不起,我没有 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());
 });

这应该有效:

var temp = [];

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

与其比较 TeamID 是否等于所选 ID,不如检查 TeamID 数组是否包含所选 ID。

如果使用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

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