AngularJS过滤到ng-repeat,排除元素,如果它们在第二个数组中

时间:2015-08-13 14:55:47

标签: angularjs filter

我需要过滤ng-repeat,如果元素存在于“suggest”数组中(通过id字段),则会爆炸“general”数组中的元素。

$scope.general= [{id: 21323, name: 'alex'}, {id: 8787, name: 'maria'}, {id: 8787, name: 'artem'}];

$scope.suggest = [{id: 21323, name: 'alex'}, {id: 8787, name: 'maria'}];
<div ng-repeat="elem in general">{{elem.name}}</div>

2 个答案:

答案 0 :(得分:2)

您应该创建自己的custom filter并且您可能希望使用Array.prototype.filter

你说你想要通过财产id排除。以下填充程序可选择允许指定属性。如果未指定该属性,则对象将被strict equality(与===或三重等于运算符使用的方法相同)排除。

angular.module('myFilters', [])
.filter('exclude', function() {
    return function(input, exclude, prop) {
        if (!angular.isArray(input))
            return input;

        if (!angular.isArray(exclude))
            exclude = [];

        if (prop) {
            exclude = exclude.map(function byProp(item) {
                return item[prop];
            });
        }

        return input.filter(function byExclude(item) {
            return exclude.indexOf(prop ? item[prop] : item) === -1;
        });
    };
});

在html中使用此过滤器:

<div ng-repeat="elem in general | exclude:suggest:'id'">{{elem.name}}</div>

以下是jsfiddle的示例: https://jsfiddle.net/6ov1sjfb/

请注意,在你的问题中,artem的id与玛丽亚相匹配,因此artem和maria都被过滤了。我在plunker中更改了artem的id,以显示过滤器的工作原理。

答案 1 :(得分:0)

试试这个:

var myApp = angular.module('myApp', []);


function MyCtrl($scope) {
    $scope.general = [{
        id: 21323,
        name: 'alex'
    }, {
        id: 8787,
        name: 'maria'
    }, {
        id: 8787,
        name: 'artem'
    }];

    $scope.suggest = [{
        id: 21323,
        name: 'alex'
    }, {
        id: 8787,
        name: 'maria'
    }];
    $scope.filteredArray = function () {
        return $scope.general.filter(function (letter) {
            for (i = 0; i < $scope.suggest.length; i++) {
              return  $scope.suggest[i].id !== letter.id 

            }
        });
    };
}

 <div ng-repeat="elem in filteredArray(letters)">{{elem.name}}</div>

查看小提琴:http://jsfiddle.net/o2er6msv/

注意:请chk你的id,它们是重复的