Как фильтровать данные на основе двух настраиваемых фильтров в Angular js

У меня есть два настраиваемых фильтра, я хочу отфильтровать свои данные, используя оба этих настраиваемых фильтра. Но я столкнулся с проблемой: если я использовал один за другим, тогда они работают хорошо, но когда я пытаюсь использовать оба фильтра одновременно, то нет вывода. Мой код выглядит следующим образом:

<script>
     var myApp = angular.module('myApp', []);
     myApp
.filter('selectedTags', function() {
    return function(postdata, tags) {
        return postdata.filter(function(task) {

            for (var i in task.tarn_list) {
                if (tags.indexOf(task.tarn_list[i]) != -1) {
                    return true;
                }
            }
            return false;

        });
    };
})
.filter('selectedDep', function() {
    return function(postdata, tags) {
        return postdata.filter(function(task) {

            for (var i in task.deployment) {
                if (tags.indexOf(task.deployment[i]) != -1) {
                    return true;
                }
            }
            return false;

        });
    };
})
.controller('PostList', ['$scope', '$http', function($scope, $http) {
           var jsonFile='../../json.php';
           $http.get(jsonFile).success(function(data) {
            $scope.postdata = data;
           });
           $scope.useMakes=[]
           $scope.checkBoxModel={
                    search:[],
                    ddsearch:[]
                };
           $scope.totalFeatures=features;
           $scope.deployment=all_deployment;
        }]);
</script>

Мой div следующий, на который я хочу применить фильтр:

<div ng-repeat="record in postdata | selectedDep:checkBoxModel.ddsearch | selectedTags:checkBoxModel.search" >

Ответ 1

Не увидев фактический набор данных, здесь следует плавать лодку, которую я считаю, - учитывая свойства, которые вы выставили в своем вопросе, и характер петель;

https://jsfiddle.net/op7m14m1/1/


Вместо циклов for in я выбрал вложенные фильтры (это, по сути, то, что вы делаете).

var predicate = [];

dataset.filter(function (a) {
  var inner = a.inner.filter(function (b) {
    return predicate.indexOf(b) > -1;
  });

  return inner.length > 0; 
});

Посмотрев на два фильтра, которые у вас есть, вы можете разбить его на одну функцию с параметром bound (или pass in), определяющим, какое свойство использовать в качестве соединителя для фильтра (ов).

Что-то вроде этого;

function generic () {
  return function (prop, dataset, predicate) {
    return dataset.filter(function (element) {

      var innards = element[prop].filter(function (iEl) {
        return predicate.indexOf(iEl) > -1;
      });

      return innards.length > 0;
    });
  }
}

И затем, чтобы использовать его, вы могли бы сделать следующее:

 module.filter('genericFilter', generic);
 module.filter('selectedDep',   generic.bind(null, 'deployment');
 module.filter('selectedTags',  generic.bind(null, 'tarn_list');

 // $filter('genericFilter')('deployment', [], ['a']);
 // $filter('selectedDep')([], ['b']);
 // $filter('selectedTags')([], ['c']);

Эта настройка позволяет использовать одну функцию, которую вы можете повторно использовать в своем сердечном содержимом - просто передайте свойство, которое вы хотели бы сделать глубокий фильтр, или привяжите его превентивно.