J'ai ce genre de tableau:
var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];
Je voudrais le filtrer pour avoir:
var bar = [ { "a" : "1" }, { "b" : "2" }];
J'ai essayé d'utiliser _.uniq, mais je suppose que parce que ce { "a" : "1" }
n'est pas égal à lui-même, cela ne fonctionne pas. Existe-t-il un moyen de fournir un soulignement uniq avec une fonction de substitution égale?
javascript
json
underscore.js
plus-
la source
la source
{ "a" : "2" }
existent-elles? Si oui, est-ce l'attribut ou la valeur qui le rend unique?Réponses:
.uniq / .unique accepte un rappel
Remarques:
Autre exemple: utiliser le callback pour extraire les marques de voitures, les couleurs d'une liste
la source
false
n'est pas nécessaire pour_.uniq()
. Aussi dans lodash, vous auriez pu l'écrire comme ça_.uniq(a, 'a');
, car il épilera la propriétéa
sur les objets._.uniq(a, false, 'a')
) j'ai envoyé un ping à github / bestiejs / lodash et ils ont dit que le problème était résolu sur le bord. Donc, si vous n'utilisez pas de fonction, assurez-vous d'avoir la dernière. Cela peut ne pas être un problème pour le trait de soulignement.Si vous cherchez à supprimer les doublons en fonction d'un identifiant, vous pouvez faire quelque chose comme ceci:
la source
Date
. Mais c'est le cas.Mise en œuvre de la réponse de Shiplu.
la source
JSON.parse(x[0]).a
parce que x n'est pas un tableau d'objets, c'est un tableau de chaînes. De plus, si vous ajoutez des valeurs b aux uniques et inversez l'ordre de a / b, elles ne sont plus considérées comme uniques par votre fonction. (par exemple, "" {\ "a \": \ "1 \", \ "b \": 2} "! =" {\ "b \": 2, \ "a \": \ "1 \"} ") Il me manque peut-être quelque chose, mais le résultat ne devrait-il pas au moins être utile? Voici un jsbin pour illustrer jsbin.com/utoruz/2/edita
pour chaque objet, alors qu'il pourrait y avoir des objets en double ne contenant pas la cléa
. Cependant, il serait logique que cea
soit un identifiant unique.(a ==(=) b when a = b = {a:1})
. Le point de ma réponse était l'itérateur. J'ai essayé de répondre sans me soucier du motif, qui pourrait être n'importe quoi, non? (par exemple, ils voulaient peut-être extraire une liste de marques, de couleurs d'une liste de voitures dans un spectacle. jsbin.com/evodub/2/edit ) Bravo !iterator
Quand j'ai un identifiant d'attribut, c'est ma manière préférée de soulignement:
la source
L'utilisation de la librairie unique de soulignement qui suit fonctionne pour moi, je rend la liste unique en fonction de _id, puis renvoie la valeur String de _id:
la source
Voici une solution simple, qui utilise une comparaison d'objets approfondie pour vérifier les doublons (sans recourir à la conversion en JSON, ce qui est inefficace et piraté)
Il filtre tous les éléments s'ils ont un doublon plus tard dans le tableau - de sorte que le dernier élément en double est conservé.
Le test des utilisations en double
_.isEqual
qui effectue une comparaison approfondie optimisée entre les deux objets, consultez la documentation isEqual de soulignement pour plus d'informations.edit: mis à jour pour utiliser
_.filter
ce qui est une approche plus proprela source
La documentation de lodash 4.6.1 a ceci comme exemple d'égalité de clé d'objet:
_.uniqWith(objects, _.isEqual);
https://lodash.com/docs#uniqWith
la source
Essayez la fonction d'itérateur
Par exemple, vous pouvez retourner le premier élément
la source
_.uniq(x,function(i){ return i[0]; });
voici ma solution (coffeescript):
exemple:
la source
avec un soulignement, j'ai dû utiliser String () dans la fonction iteratee
la source
Je voulais résoudre cette solution simple d'une manière simple d'écrire, avec un peu de peine de frais de calcul ... mais n'est-ce pas une solution triviale avec une définition de variable minimale, n'est-ce pas?
la source
Permet de décomposer cela. Commençons par regrouper les éléments du tableau par leur valeur stringifiée
grouped
ressemble à:Puis attrapons le premier élément de chaque groupe
bar
ressemble à:[ { "a" : "1" }, { "b" : "2" } ]
Mets le tout ensemble:
la source
Vous pouvez le faire en abrégé comme:
_.uniq(foo, 'a')
la source