trait de soulignement/lodash unique par de multiples propriétés
J'ai un tableau d'objets avec des doublons et je vais essayer d'obtenir un unique d'inscription, où l'unicité est définie par un sous-ensemble des propriétés de l'objet. Par exemple,
{a:"1",b:"1",c:"2"}
Et je veux ignorer c
dans l'unicité de comparaison.
Je peux faire quelque chose comme
_.uniq(myArray,function(element) { return element.a + "_" + element+b});
J'espérais que je pourrais faire
_.uniq(myArray,function(element) { return {a:element.a, b:element.b} });
Mais qui ne fonctionne pas. Est-il quelque chose comme ce que je peux faire, ou dois-je créer, comparable à une représentation de l'objet, si je suis la comparaison de plusieurs propriétés?
- Et pourquoi essayez-vous de faire la deuxième tentative? La première est de travail, droit?
- Oui, le premier est un travail, mais il se sent un peu hacky avoir à faire la concaténation de chaîne. En essayant de comprendre si il ya un moyen plus naturel pour ce faire.
- les objets sont toujours uniques, de sorte que vous besoin de comparer par la propriété individuelle des valeurs, non pas par l'ensemble des objets. à l'aide d'une comparaison de chaîne peut fonctionner avec certaines données, mais pas d'autres, par exemple: avec des chaînes numériques comme indiqué, le risque de collision {a:"1"} avec {a:1}.s
- _.uniq([{un:"1",b:"1",c:"2"},{a:"1",b:"2",c:"2"},{a:"1",b:"1",c:"2"}], JSON.stringify); JSON ordre n'est pas garanti, mais je ne vois pas pourquoi ce ne serait pas au sein d'un seul navigateur.
- Dans mon cas particulier, je ne fais que de la comparaison de chaînes. @dandavis je ne veux pas de comparer tous les attributs, seul un sous-ensemble d'entre eux
- Je pense qu'il serait mieux pour emballer les propriétés dans des tableaux avant de JSONifying eux. Ou écrire votre propre version de
_.uniq
qui utilise_.isEqual
au lieu de===
. - vous souhaitez utiliser
_unique
strictement, ou vous voulez faire une plus fonctionnelles de la solution? comme la création d'un comparateur de fonction et de combinerreduce/find
ou combilefilter/find
?
Vous devez vous connecter pour publier un commentaire.
Il ne semble pas être un moyen simple pour ce faire, malheureusement. À court d'écrire votre propre fonction pour cela, vous aurez besoin de revenir à quelque chose qui peut être directement comparés pour l'égalité (comme dans votre premier exemple).
Une méthode serait de juste
.join()
les propriétés dont vous avez besoin:Alternativement, vous pouvez utiliser
_.choisir
ou_.omettre
pour supprimer tout ce que vous n'avez pas besoin. À partir de là, vous pouvez utiliser_.values
avec un.join()
, ou même justeJSON.stringify
:Garder à l'esprit que les objets ne sont pas déterministes à la propriété ordonnance, de sorte que vous pouvez simplement s'en tenir à l'explicite de la matrice de l'approche.
P. S. Remplacer
uniqBy
avecuniq
pour Lodash < 4join('')
est plein de trous (comme[1,23]
et[12,3]
).JSON.stringify
sur le tableau, au lieu d'utiliserjoin
. Vraiment, cependant, il serait plus facile de réécrireuniq
de prendre en considération de multiples propriétés._.uniqWith(myArray, _.isEqual)
uniqBy
au lieu deuniq
dans Lodash >= 4.uniq
utiliser, si ce n'est_.isEqual
?Je pense que le join() est l'approche la plus simple. Malgré les préoccupations soulevées dans la solution précédente, je pense choisir le bon séparateur est la clé pour éviter les écueils identifiés (avec différents ensembles de valeurs de retour de la même rejoint valeur). Gardez à l'esprit, le séparateur n'a pas besoin d'être un caractère unique, il peut être n'importe quelle chaîne que vous êtes confiant ne se produisent naturellement dans les données elles-mêmes. Je le fais tout le temps et je suis friands de l'utilisation de '~!$~' comme mon séparateur. Il peut également inclure des caractères spéciaux comme " \t\r\n etc.
Si les données contenues est vraiment imprévisible, peut-être la longueur max est connu et vous pouvez simplement le pad de chaque élément à son maximum avant de les rejoindre.
Utilisation Lodash de
uniqWith
méthode:_.uniqWith(array, [comparator])
Lorsque le
comparator
retournetrue
, les éléments sont considérés comme des doublons et seule la première occurrence sera inclus dans le nouveau tableau.Exemple:
J'ai une liste des endroits à
latitude
etlongitude
- dont certains sont identiques, et je veux voir la liste des emplacements uniques:Il y a un indice dans @voithos et @Danail combiné de réponse. Comment j'ai résolu ce problème a été d'ajouter une clé unique sur les objets de mon tableau.
Partir Des Données De L'Échantillon
Dans l'exemple ci-dessus, je veux que la matrice soit unique par
a
etb
mais pour l'instant j'ai deux objets qui onta: 4
etb: 'cat'
. Par la combinaison a + b dans une chaîne que je peux obtenir une clé unique pour vérifier par.Remarque: Vous aurez évidemment besoin de la carte sur les données ou le faire lors de la création de l'objet que vous ne pouvez pas référence à des propriétés d'un objet dans le même objet.
Maintenant la comparaison est simple...
Le tableau résultant seront longueur de 3 il aura enlevé la dernière double.