AngularJS: как фильтровать массив объектов, кроме одного свойства

Angular $filter может выполнять нечеткий поиск строк для массива объектов,

Но у каждого из моих объектов есть одно свойство base64 pic.

var MyObjects = [{
    property1: 'ab',
    property2: 'cd',
    pic: '4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBw.....' 
}, {
    property1: 'ef',
    property2: 'gh',
    pic: '4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBw.....' 
}, {
    ....


}],

result = $filter('filter')(MyObjects, $scope.searchText);

Как я могу исключить свойство pic в нечетком поиске?


person Chen-Tsu Lin    schedule 30.05.2014    source источник


Ответы (2)


Фильтр Angular может принимать функцию в качестве аргумента для фильтрации вашего массива. Фильтр будет выбирать элементы, для которых функция возвращает значение true.

Вы можете использовать эту функцию для достижения желаемого.

Вот официальная документация

Итак, вы можете сделать что-то подобное, чтобы сравнить текст поиска только с двумя свойствами, которые вы хотите:

var filterFunction = function(item) {
    var val = $scope.searchText
    return item.property1.indexOf(val || '') !== -1 || item.property2.indexOf(val || '') !== -1;
}

result = $filter('filter')(MyObjects, filterFunction, $scope.searchText);

Вот скрипка, демонстрирующая этот эффект.

person Nick    schedule 30.05.2014

Вот так я его реализовал. Угловые настраиваемые фильтры, похоже, подходят для решения такой проблемы. Подробнее о них можно узнать в Angular, но в этой реализации вы можете добавить любые другие поля, которые вы хотели бы оставить, добавив еще один && key != "unwantedKey". Значение ключа должно быть строкой, чтобы indexOf работал, поэтому часть typeof гарантирует, что мы не получим никаких идентификаторов, которые являются числами и т. д.

$scope.search = function(item){ 
    for (var key in item){
        if (typeof key === "string" && key != "pic"){ 

            if(item[key].indexOf($scope.query) > -1){
                return true;
            }
        }
    }
    return false;
};
person tenor528    schedule 04.02.2016