Estoy ejecutando un simple ng-repeat
sobre un archivo JSON y quiero obtener nombres de categoría. Hay alrededor de 100 objetos, cada uno perteneciente a una categoría, pero solo hay alrededor de 6 categorías.
Mi código actual es este:
<select ng-model="orderProp" >
<option ng-repeat="place in places" value="{{place.category}}">{{place.category}}</option>
</select>
La salida es de 100 opciones diferentes, en su mayoría duplicadas. ¿Cómo uso Angular para verificar si {{place.category}}
ya existe un y no crear una opción si ya está allí?
editar: en mi javascript $scope.places = JSON data
, solo para aclarar
db.collection.distinct("places")
, que era mucho, mucho mejor que hacerlo en Angular. Lamentablemente, esto no funcionará para todos.Respuestas:
Puede usar el filtro único de AngularUI (código fuente disponible aquí: filtro único de AngularUI ) y usarlo directamente en las opciones ng (o ng-repeat).
fuente
angular.module('yourModule', ['ui', 'ui.filters']);
. Estaba perplejo hasta que eché un vistazo dentro del archivo AngularUI js.unique
filtro se puede encontrar actualmente como parte de AngularJs UI Utilsangular.module('ui.filters')
el nombre de su aplicación.O puede escribir su propio filtro usando lodash.
fuente
_.uniqBy(arr, field);
debería funcionar para propiedades anidadasPuede usar el filtro 'único' (alias: uniq) en el módulo angular.filter
uso:
colection | uniq: 'property'
también puede filtrar por propiedades anidadas:
colection | uniq: 'property.nested_property'
Lo que puedes hacer es algo así ...
HTML: filtramos por ID de cliente, es decir, eliminamos clientes duplicados
resultado
Lista de clientes:
foo 10
bar 20
baz 30
fuente
Este código me funciona.
y entonces
fuente
Si desea enumerar categorías, creo que debe indicar explícitamente su intención en la vista.
en el controlador:
fuente
group by
expresión en laselect
directiva.Aquí hay un ejemplo sencillo y genérico.
El filtro:
El marcado:
fuente
Cannot read property 'length' of undefined
en la líneal = arr.length
Decidí extender la respuesta de @ thethakuri para permitir cualquier profundidad para el miembro único. Aquí está el código. Esto es para aquellos que no desean incluir todo el módulo AngularUI solo para esta funcionalidad. Si ya está usando AngularUI, ignore esta respuesta:
Ejemplo
fuente
Tenía una serie de cadenas, no objetos, y usé este enfoque:
con este filtro:
fuente
ACTUALIZAR
Estaba recomendando el uso de Set, pero lo siento, esto no funciona para ng-repeat, ni Map ya que ng-repeat solo funciona con array. Así que ignora esta respuesta. de todos modos, si necesita filtrar duplicados de una manera, como lo ha dicho otra, usando
angular filters
, este es el enlace a la sección de inicio .Vieja respuesta
Puede usar la estructura de datos de conjunto estándar ECMAScript 2015 (ES6) , en lugar de una estructura de datos de matriz de esta manera, filtra los valores repetidos al agregar al conjunto. (Recuerde que los conjuntos no permiten valores repetidos). Muy fácil de usar:
fuente
Aquí hay una forma de hacerlo solo con plantilla (sin embargo, no es mantener el orden). Además, el resultado también se ordenará, lo cual es útil en la mayoría de los casos:
fuente
Ninguno de los filtros anteriores solucionó mi problema, así que tuve que copiar el filtro del documento oficial de github. Y luego úsalo como se explica en las respuestas anteriores
función de retorno (items, filterOn) {
fuente
Parece que todos están lanzando su propia versión del
unique
filtro al ring, así que haré lo mismo. La crítica es muy bienvenida.fuente
Si desea obtener datos únicos basados en la clave anidada:
Llámalo así:
fuente
Agregue este filtro:
Actualiza tu marcado:
fuente
Esto puede ser excesivo, pero funciona para mí.
La función distinta depende de la función contiene definida anteriormente. Se puede llamar como
array.distinct(prop);
donde prop es la propiedad que desea que sea distinta.Entonces podrías decir
$scope.places.distinct("category");
fuente
Crea tu propia matriz.
fuente