Javascript(angularJS):按多个字段过滤

Javascript(angularJS):按多个字段过滤,javascript,angularjs,filter,Javascript,Angularjs,Filter,例如,我有这样的列表(我与ng repeat一起使用): 我有过滤器阵列: nameFilter: ['Peter Ollison', 'Nikolay Ivanov'] typeFilter: ['Manager', 'Driver'] statusFilter: ['Working'] 如何在过滤器功能中组合所有这些过滤器?并且只从列表中返回这些项,它们等于过滤器数组?但是我可以: 仅按名称筛选,或仅按类型筛选,或按2个字段筛选,或按所有字段筛选 如何筛选我的列表 例如,如果我一次按3个过

例如,我有这样的列表(我与ng repeat一起使用):

我有过滤器阵列:

nameFilter: ['Peter Ollison', 'Nikolay Ivanov']
typeFilter: ['Manager', 'Driver']
statusFilter: ['Working']
如何在过滤器功能中组合所有这些过滤器?并且只从列表中返回这些项,它们等于过滤器数组?但是我可以:

仅按名称筛选,或仅按类型筛选,或按2个字段筛选,或按所有字段筛选

如何筛选我的列表

例如,如果我一次按3个过滤器阵列进行过滤,我应该得到以下结果:

[{id: 1, name: 'Peter Ollison', type: 'Driver', status: 'Working'},
{id: 4, name: 'Nikolay Ivanov', type: 'Manager', status: 'Working'}]

现在我只能在控制器中按一个值进行筛选,并且我被多个字段筛选所困扰((

使用嵌套的
数组.prototype.filter()

var filterProps =  ['name','type','status'];

var filteredData = myList.filter(function(item){
  return  filterProps.filter(function(prop){
    var filter = filters[prop +'Filter'];   
    return !filter || !filter.length ||  filter.indexOf(item[prop]) >-1;
  }).length === filterProps.length;
})
var myList=[
{id:1,名称:'Peter Ollison',类型:'Driver',状态:'Working'},
{id:2,名称:'Maya Nameson',类型:'Manager',状态:'Not'},
{id:3,名称:'Iki Jonny',键入:'Driver',状态:'Paused'},
{id:4,名称:'Nikolay Ivanov',键入:'Manager',状态:'Working'},
{id:5,姓名:'Nikolay Ivanov',键入:'Sales manager',状态:'Not'},
{id:6,名称:'Scotty Deperson',类型:'Boss',状态:'Working'},
]
变量过滤器={
姓名过滤器:['Peter Ollison','Nikolay Ivanov'],
类型筛选器:['Manager','Driver'],
状态筛选器:[“正在工作”]
}
var filteredData=myList.filter(函数(项){
var filterProps=['name'、'type'、'status']
返回过滤器rops.filter(函数(prop)){
var filter=过滤器[prop+'filter'];
return!filter | | |!filter.length | | filter.indexOf(item[prop])>-1;
}).length==filterProps.length;
});

console.log(Filteredata)
请共享您的代码。@Abhijeet您想通过同时匹配每个属性的任何值进行筛选吗?因此名称可能是peter或nikolay,类型可能是manager或driver,状态必须正常吗?@LeonardoLana Yes请尝试一下如果我有resultStatusCount==[],它将不会输出任何内容
$scope.showIssueItem = function (item) {
  var resultAssigneeCount = 0,
      resultTypeCount = 0,
      resultStatusCount = 0;

  if ($scope.nameFilterArr.length > 0) {
    angular.forEach($scope.nameFilterArr, function(value) {
      if (item.name === value) {
        resultAssigneeCount++;
      }
    });
  }else{
       resultAssigneeCount = 1;
  }

  if ($scope.typeFilterArr.length > 0) {
    angular.forEach($scope.typeFilterArr, function(value) {
      if (item.type === value) {
        resultTypeCount++;
      }
    });
  }else{
       resultTypeCount = 1;
  }

  if ($scope.statusFilterArr.length > 0) {
    angular.forEach($scope.statusFilterArr, function(value) {
      if (item.status === value) {
        resultStatusCount++;
      }
    });
  }else{
       resultStatusCount = 1;
  }

  return resultAssigneeCount>0 && resultTypeCount>0 && resultStatusCount>0;
};
function contains(a, obj) {
    var i = a.length;
    while (i--) {
       if (a[i] === obj) {
           return true;
       }
    }
    return false;
}

$scope.showItemOrNot = function (item) {

          var match = [];
          var filters = [ {
             attr : 'assignee',
             source : $scope.assigneeFilterArr
            },
            {
                attr : 'type',
                source : $scope.typeFilterArr
            },
            {
                attr : 'status',
                source : $scope.statusFilterArr
            }
            ];

          for(var x in filters) {
              if(filters[x].source.length > 0) {
                match.push(contains(filters[x].source,item[filters[x].attr]));
              }
          }

          return !contains(match,false);
};
var filterProps =  ['name','type','status'];

var filteredData = myList.filter(function(item){
  return  filterProps.filter(function(prop){
    var filter = filters[prop +'Filter'];   
    return !filter || !filter.length ||  filter.indexOf(item[prop]) >-1;
  }).length === filterProps.length;
})