Dentro de mi controlador, me gustaría filtrar una matriz de objetos. Cada uno de estos objetos es un mapa que puede contener cadenas y listas
Intenté usar el $filter('filter')(array, function)
formato pero no sé cómo acceder a los elementos individuales de la matriz dentro de mi función. Aquí hay un fragmento para mostrar lo que quiero.
$filter('filter')(array, function() {
return criteriaMatch(item, criteria);
});
Y luego, en el criteriaMatch()
, verificaré si cada una de las propiedades individuales coincide
var criteriaMatch = function(item, criteria) {
// go thro each individual property in the item and criteria
// and check if they are equal
}
Tengo que hacer todo esto en el controlador y compilar una lista de listas y configurarlas en el alcance. Así que necesito acceder $filter('filter')
solo de esta manera. Todos los ejemplos que encontré en la red hasta ahora tienen búsquedas de criterios estáticos dentro de la función, no pasan un objeto de criterios y prueban cada elemento de la matriz.
fuente
Respuestas:
Puede usarlo así: http://plnkr.co/edit/vtNjEgmpItqxX5fdwtPi?p=preview
Como encontró,
filter
acepta la función de predicado que acepta elemento por elemento de la matriz. Entonces, solo tiene que crear una función de predicado basada en lo dadocriteria
.En este ejemplo,
criteriaMatch
es una función que devuelve una función de predicado que coincide con la dadacriteria
.modelo:
alcance:
fuente
filter
método nativo en el objeto Array:array.filter(function(item){return item.name === criteria.name;})
Aquí hay un ejemplo de cómo lo usaría
filter
dentro de su JavaScript AngularJS (en lugar de en un elemento HTML).En este ejemplo, tenemos una matriz de registros de países, cada uno con un nombre y un código ISO de 3 caracteres.
Queremos escribir una función que busque en esta lista un registro que coincida con un código específico de 3 caracteres.
Así es como lo haríamos sin usar
filter
:Sí, no hay nada de malo en eso.
Pero así es como se vería la misma función, usando
filter
:Mucho más ordenado.
Recuerde que
filter
devuelve una matriz como resultado (una lista de registros coincidentes), por lo que en este ejemplo, queremos devolver 1 registro o NULL.Espero que esto ayude.
fuente
Además, si desea usar el filtro en su controlador de la misma manera que lo hace aquí:
Podrías hacer algo como:
fuente
var filteredItems = $filter('criteriaMatch')(items, criteria);