точный фильтр в угловом
В Angular, есть ли способ изменить фильтр таким образом, чтобы он возвращал только точные совпадения?
Пример:
var words = [ { title: "ball" }, { title: "wall" }, { title: "all" }, { title: "alloy" } ]; var wordsFiltered = filter('filter') ( words, { 'title': 'all' } );
Вышеупомянутое будет соответствовать «шарикам», «стенам», «всем» и «сплавам». Но я бы хотел, чтобы он соответствовал только «всем». Любой способ изменить его?
- как реализовать фильтрацию в RealmRecyclerViewAdapter
- Как эффективно фильтровать фрейм данных?
- Фильтр ListView с массивом
- Поверните изображение MATLAB в изображение
- Добавить фильтр на RecyclerView с карточками?
- Пользовательская фильтрация на Android с помощью ArrayAdapter
- Запуск пользовательского приложения для Android от браузера android
- Удаление повторяющихся строк без сортировки
- Каков наилучший способ фильтрации коллекции Java?
- Пользовательский фильтр ArrayAdapter в ListView
- Power BI Встраивание URL-множественных фильтров
- Что такое фильтры намерений в Android?
- Как фильтровать массив из всех элементов другого массива
ОБНОВИТЬ
Начиная с AngularJS v.1.1.3 точная фильтрация обеспечивается изначально :
Find words that exactly match title:
and exactly match type:
{{word.title}}
Plunker
Ваш вопрос подразумевает, что вы хотите сопоставлять несколько свойств объекта, поэтому вот фильтр, который делает это:
app.controller('AppController', [ '$scope', function($scope) { $scope.match = {}; $scope.words = [ { title: "ball", type: 'object' }, { title: "wall", type: 'object' }, { title: "all", type: 'word' }, { title: "alloy", type: 'material' } ]; } ] ); app.filter('exact', function(){ return function(items, match){ var matching = [], matches, falsely = true; // Return the items unchanged if all filtering attributes are falsy angular.forEach(match, function(value, key){ falsely = falsely && !value; }); if(falsely){ return items; } angular.forEach(items, function(item){ // eg { title: "ball" } matches = true; angular.forEach(match, function(value, key){ // eg 'all', 'title' if(!!value){ // do not compare if value is empty matches = matches && (item[key] === value); } }); if(matches){ matching.push(item); } }); return matching; } });
Find words that exactly match title:
and exactly match type:
{{word.title}}
PLUNKER
Попробуй это :
var words = [ { title: "ball" }, { title: "wall" }, { title: "all" }, { title: "alloy" } ]; var wordsFiltered = filter('filter') ( words, { 'title': 'all' }, true );
Вы можете использовать Regex для достижения простой реализации:
В controllerе:
$scope.myFilter = function (word) { if ($scope.query === '') return true; var reg = RegExp("^" + $scope.query + "$"); return reg.test(word.title); };
Я бы создал новый фильтр. Это то, что вы хотите?
HTML
{{words | exactMatch:'all'}} !
JavaScript
var myApp = angular.module('myApp',[]); myApp.filter('exactMatch', function() { return function(words, pattern) { var result = []; words.forEach(function (word) { if (word.title === pattern) { result.push(word); } }); return result; } }); function MyCtrl($scope) { $scope.words = [ {title: "ball", other: 1}, {title: "wall", other: 2}, {title: "all", other: 3}, {title: "alloy", other: 4}, {title: "all", other: 5}, ]; }
JsFiddle: jsfiddle
Дополнительная информация о пользовательских фильтрах: фильтры , создание настраиваемых фильтров и использование фильтров
Если вы хотите использовать фильтр в Javascript вместо html, вы должны посмотреть здесь: jsfiddle
Я создал свой собственный фильтр.
app.filter('exactMatch', function() { return function(elements, pattern) { var result = []; var fieldSearch = Object.keys(pattern)[0]; elements.forEach(function (element) { if (element[fieldSearch] == pattern[fieldSearch]) { result.push(element); } }); return result; } });
угловой фильтр – полезная библиотека фильтров.
Один из их фильтров – это фильтр, который выполняет точное совпадение.