J'exécute un simple ng-repeat
sur un fichier JSON et je souhaite obtenir des noms de catégories. Il y a environ 100 objets, chacun appartenant à une catégorie - mais il n'y a qu'environ 6 catégories.
Mon code actuel est le suivant:
<select ng-model="orderProp" >
<option ng-repeat="place in places" value="{{place.category}}">{{place.category}}</option>
</select>
La sortie est 100 options différentes, pour la plupart des doublons. Comment utiliser Angular pour vérifier si un {{place.category}}
existe déjà et ne pas créer d'option s'il existe déjà?
edit: Dans mon javascript $scope.places = JSON data
, juste pour clarifier
db.collection.distinct("places")
, ce qui était bien, bien mieux que de le faire dans Angular! Malheureusement, cela ne fonctionnera pas pour tout le monde.Réponses:
Vous pouvez utiliser le filtre unique d'AngularUI (code source disponible ici: AngularUI unique filter ) et l'utiliser directement dans les ng-options (ou ng-repeat).
la source
angular.module('yourModule', ['ui', 'ui.filters']);
. J'étais perplexe jusqu'à ce que je jette un coup d'œil dans le fichier js AngularUI.unique
filtre peut actuellement être trouvé dans le cadre de AngularJs UI Utilsangular.module('ui.filters')
le nom de votre application.Ou vous pouvez écrire votre propre filtre en utilisant lodash.
la source
_.uniqBy(arr, field);
devrait fonctionner pour les propriétés imbriquéesVous pouvez utiliser le filtre 'unique' (alias: uniq) dans le module angular.filter
utilisation:
colection | uniq: 'property'
vous pouvez également filtrer par propriétés imbriquées:
colection | uniq: 'property.nested_property'
Ce que vous pouvez faire, c'est quelque chose comme ça ...
HTML: nous filtrons par identifiant client, c'est-à-dire supprimons les clients en double
résultat
Liste des clients:
foo 10
bar 20
baz 30
la source
ce code fonctionne pour moi.
puis
la source
Si vous souhaitez lister des catégories, je pense que vous devez explicitement indiquer votre intention dans la vue.
dans le contrôleur:
la source
group by
expression dans laselect
directive.Voici un exemple simple et générique.
Le filtre:
Le balisage:
la source
Cannot read property 'length' of undefined
dans la lignel = arr.length
J'ai décidé d'étendre la réponse de @ thethakuri pour autoriser n'importe quelle profondeur pour le membre unique. Voici le code. C'est pour ceux qui ne veulent pas inclure tout le module AngularUI uniquement pour cette fonctionnalité. Si vous utilisez déjà AngularUI, ignorez cette réponse:
Exemple
la source
J'avais un tableau de chaînes, pas d'objets et j'ai utilisé cette approche:
avec ce filtre:
la source
METTRE À JOUR
Je recommandais l'utilisation de Set mais désolé cela ne fonctionne pas pour ng-repeat, ni pour Map puisque ng-repeat ne fonctionne qu'avec array. Alors ignorez cette réponse. Quoi qu'il en soit, si vous avez besoin de filtrer les doublons dans un sens, comme l'a dit l'autre
angular filters
, voici le lien pour cela vers la section de démarrage .Ancienne réponse
Vous pouvez utiliser la structure de données d'ensemble standard ECMAScript 2015 (ES6) , au lieu d'une structure de données de tableau, de cette façon, vous filtrez les valeurs répétées lors de l'ajout à l'ensemble. (Rappelez-vous que les ensembles ne permettent pas de valeurs répétées). Vraiment facile à utiliser:
la source
Voici une façon de le faire uniquement par modèle (cependant, il ne s'agit pas de maintenir l'ordre). De plus, le résultat sera également ordonné, ce qui est utile dans la plupart des cas:
la source
Aucun des filtres ci-dessus n'a résolu mon problème, j'ai donc dû copier le filtre de la documentation officielle de github. Et puis utilisez-le comme expliqué dans les réponses ci-dessus
fonction de retour (éléments, filterOn) {
la source
Il semble que tout le monde jette sa propre version du
unique
filtre sur le ring, alors je vais faire de même. La critique est la bienvenue.la source
Si vous souhaitez obtenir des données uniques basées sur la clé imbriquée:
Appelez ça comme ça:
la source
Ajoutez ce filtre:
Mettez à jour votre balisage:
la source
C'est peut-être exagéré, mais cela fonctionne pour moi.
La fonction distincte dépend de la fonction contient définie ci-dessus. Il peut être appelé comme
array.distinct(prop);
où prop est la propriété que vous souhaitez distinguer.Alors tu pourrais juste dire
$scope.places.distinct("category");
la source
Créez votre propre tableau.
la source