У меня есть global filter, который фильтрует данные на основе ввода текста.
<search-box ng-model = "vm.filter.keyword"></search-box>
И мы используем такой фильтр
<tr ng-repeat = "group in vm.groups | searchGlobal:vm.filter.keyword
Мой фильтр выглядит так:
.filter('searchGlobal',
function searchGlobal () {
return function searchGlobal (searchValArr,filterText) {
var filteredData = [];
for(var i = 0; i <searchValArr.length; i++) {
if (searchValArr[i].name.toLowerCase().indexOf(filterText.toLowerCase()) !== -1 ||
searchValArr[i].id.indexOf(filterText) !== -1) {
filteredData.push(searchValArr[i]);
}
}
return filteredData;
};
});
Вот в чем проблема.
Поля для поиска могут просто не бытьname и id.
В некоторых случаях они могут бытьname, phone_numbers,
в некоторых случаяхname, age, refNumbers.
Как мне соответствующим образом обработать логику сценария внутри фильтра?
@TanDuong Первым параметром всегда является набор данных ngRepeat, а вторым - vm.filter.keyword



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете добавить еще один параметр для проверки желаемого свойства
<tr ng-repeat = "group in vm.groups | searchGlobal:vm.filter.keyword:vm.filter.listKeys
.filter('searchGlobal',
function searchGlobal () {
return function searchGlobal (searchValArr,filterText, listKeys) {
var filteredData = [];
var listIdAdd = [];
if (angular.isUnDefined(listKeys) || !angular.isArray(listKeys)) {
listKeys = ['name', 'id'];
}
for(var i = 0; i <searchValArr.length; i++) {
for (var j = 0; j < listKeys.length; j++) {
if (searchValArr[i][listKeys[j]].toLowerCase().indexOf(filterText.toLowerCase()) !== -1 &&
listIdAdd.indexOf(searchValArr[i].id === -1)) {
filteredData.push(searchValArr[i]);
listIdAdd.push(searchValArr[i].id);
}
}
}
return filteredData;
};
});
Надеюсь на эту помощь
Вы можете создать фильтр, который будет проверять, содержит ли какой-либо из ключей объекта ключевое слово.
Я создал простой пример здесь.
Функция фильтра выглядит следующим образом, обратите внимание, что она использует некоторые современные функции JS, такие как Object.values и String.includes, которые можно заменить, если требуется поддержка старых браузеров.
angular.module("myApp")
.filter("searchGlobal", function(){
return function(data, keyword){
// Return a filtered array of items in the initial array
return data.filter(function(obj){
// Check if any (some) of the object keys contains the keyword
return Object.values(obj).some(function(value){
return value.includes(keyword);
});
});
};
});
Вы передаете второй параметр для просмотра
searchGlobal:vm.filter.keyword? Я видел только один параметр.