Javascript 阵列的角滤波器阵列

Javascript 阵列的角滤波器阵列,javascript,arrays,angularjs,filter,Javascript,Arrays,Angularjs,Filter,在过去的几天里,我很难过滤带有角度的数组并显示它。我曾尝试寻找类似的帖子,但我找不到解决我的问题的方法 我的数据的外观示例: $scope.answers = [ {title: "Qestion1", keywords: ["dino", "dog", "cat"]}, {title: "Quessstion2", keywords: ["cat", "dog"]} ]; 目前我正在显示一个列表: <div class="solution-box" ng-repeat=

在过去的几天里,我很难过滤带有角度的数组并显示它。我曾尝试寻找类似的帖子,但我找不到解决我的问题的方法

我的数据的外观示例:

$scope.answers = [
    {title: "Qestion1", keywords: ["dino", "dog", "cat"]},
    {title: "Quessstion2", keywords: ["cat", "dog"]}
];
目前我正在显示一个列表:

<div class="solution-box" ng-repeat="answer in pagedItems[currentPage]">
Search2()函数,该函数不更改filteredItems

$scope.search2 = function () {
        $scope.filteredItems = $filter('filter')($scope.answers, function (answer) {
            return $filter('filter')(answer.keywords, function (keyword) {
                if (searchMatch(keyword, $scope.keys)) {
                    console.log($scope.filteredItems + '/' + keyword + '|' + $scope.keys);
                    return true;
                }
                return false;
            });
        });
        $scope.currentPage = 0;
        // now group by pages
        $scope.groupToPages();
    };
有人能告诉我Search2()函数有什么问题吗? 当我记录filteredItems时,它会记录正确数量的答案,但列表仍然保持原来的大小。 我这里缺少的自定义过滤器的主要逻辑是什么


谢谢,

正如@mgilson所指出的,您需要从过滤器回调函数返回一个布尔值,但您返回的数组将始终是真实的。这里也不需要使用
$filter('filter')
。你可以这样做:

$scope.filteredItems = $scope.answers.filter(function(answer) {
    var matches = answer.keywords.filter(function() {
        return searchMatch(keyword, $scope.keys);
    });
    return matches.length > 0;
});

我建议制作一个jsfiddle/plunker。
$filter('filter')
将返回您传递给它的函数返回真实值的项目。使用
search2
,您将返回另一个
$filter('filter')
的结果,该结果可能是一个数组,因此总是真实的,因此不会进行任何过滤。你期望内部过滤器在那里做什么?我以为$filter('filter')在数组的一个级别上工作,所以我想用内部过滤器过滤关键字,然后用过滤过的关键字过滤答案。其思想是通过过滤标题和关键字来显示列表。
$scope.search2 = function () {
        $scope.filteredItems = $filter('filter')($scope.answers, function (answer) {
            return $filter('filter')(answer.keywords, function (keyword) {
                if (searchMatch(keyword, $scope.keys)) {
                    console.log($scope.filteredItems + '/' + keyword + '|' + $scope.keys);
                    return true;
                }
                return false;
            });
        });
        $scope.currentPage = 0;
        // now group by pages
        $scope.groupToPages();
    };
$scope.filteredItems = $scope.answers.filter(function(answer) {
    var matches = answer.keywords.filter(function() {
        return searchMatch(keyword, $scope.keys);
    });
    return matches.length > 0;
});