filtro exato em angular

Em Angular, existe uma maneira de modificar o filtro de forma que ele só retorne correspondências exatas?

Exemplo:

var words = [ { title: "ball" }, { title: "wall" }, { title: "all" }, { title: "alloy" } ]; var wordsFiltered = filter('filter') ( words, { 'title': 'all' } ); 

As opções acima corresponderão a ‘bola’, ‘parede’, ‘tudo’ e ‘liga’. Mas eu gostaria que correspondesse apenas ‘all’. Alguma maneira de mudar isso?

ATUALIZAR

A partir do AngularJS v.1.1.3, a filtragem exata é fornecida nativamente :

 Find words that exactly match title:  
and exactly match type:
{{word.title}}

Plunker


Sua pergunta sugere que você deseja corresponder a várias propriedades de object, então aqui está um filtro que faz isso:

 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

Tente isto:

 var words = [ { title: "ball" }, { title: "wall" }, { title: "all" }, { title: "alloy" } ]; var wordsFiltered = filter('filter') ( words, { 'title': 'all' }, true ); 

Você pode usar o Regex para obter uma implementação simples:

   

No controlador:

 $scope.myFilter = function (word) { if ($scope.query === '') return true; var reg = RegExp("^" + $scope.query + "$"); return reg.test(word.title); }; 

Eu criaria um novo filtro. É isso que voce quer?

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
Mais informações sobre filtros personalizados: filtros , criação de filtros personalizados e uso de filtros

Se você quiser usar o filtro em Javascript em vez de html você deve procurar aqui: jsfiddle

Eu criei meu próprio filtro.

   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; } }); 

O angular-filter é uma biblioteca útil de filtros.

Um de seus filtros é o filtro where que faz uma correspondência exata.