J'ai un objet qui contient un tableau d'objets.
things = new Object();
things.thing = new Array();
things.thing.push({place:"here",name:"stuff"});
things.thing.push({place:"there",name:"morestuff"});
things.thing.push({place:"there",name:"morestuff"});
Je me demande quelle est la meilleure méthode pour supprimer les objets en double d'un tableau. Ainsi, par exemple, les choses deviendraient ...
{place:"here",name:"stuff"},
{place:"there",name:"morestuff"}
javascript
arrays
object
duplicates
Travis
la source
la source
aaaaa.aaaa.push(...)
:)Réponses:
Une méthode primitive serait:
la source
Et la
es6
magie?URL de référence
Une solution plus générique serait:
Exemple de Stackblitz
la source
things.thing = things.thing.filter((thing, index, self) => self.findIndex(t => t.place === thing.place && t.name === thing.name) === index)
const uniqueArray = arrayOfObjects.filter((object,index) => index === arrayOfObjects.findIndex(obj => JSON.stringify(obj) === JSON.stringify(object)));
jsfiddle.net/x9ku0p7L/28Si vous pouvez utiliser des bibliothèques Javascript telles que le soulignement ou le lodash, je vous recommande de jeter un œil à la
_.uniq
fonction dans leurs bibliothèques. Delodash
:Fondamentalement, vous passez dans le tableau qui est ici un littéral objet et vous passez l'attribut avec lequel vous souhaitez supprimer les doublons dans le tableau de données d'origine, comme ceci:
MISE À JOUR : Lodash a maintenant introduit un
.uniqBy
également.la source
uniqBy
place deuniq
, par exemple_.uniqBy(data, 'name')
... documentation: lodash.com/docs#uniqByJ'avais exactement la même exigence, pour supprimer les objets en double dans un tableau, basé sur des doublons sur un seul champ. J'ai trouvé le code ici: Javascript: Supprimer les doublons du tableau d'objets
Donc, dans mon exemple, je supprime tout objet du tableau qui a une valeur de chaîne licenseNum en double.
Les resultats:
uniqueArray est:
la source
for(var i in array) { if(array[i][prop]){ //valid lookupObject[array[i][prop]] = array[i]; } else { console.log('falsy object'); } }
for (let i in originalArray) { if (lookupObject[originalArray[i]['id']] === undefined) { newArray.push(originalArray[i]); } lookupObject[originalArray[i]['id']] = originalArray[i]; }
Doublures les plus courtes pour ES6 +
Trouvez des pièces uniques
id
dans un tableau.Unique par plusieurs propriétés (
place
etname
)Unique par toutes les propriétés (ce sera lent pour les grands tableaux)
Gardez la dernière occurrence.
la source
Un liner avec Set
Explication:
new Set(myData.map(JSON.stringify))
crée un objet Set à l'aide des éléments myData stringifiés.la source
En utilisant ES6 + sur une seule ligne, vous pouvez obtenir une liste unique d'objets par clé:
Il peut être mis dans une fonction:
Voici un exemple de travail:
Comment ça marche
Tout d'abord, le tableau est remappé de manière à pouvoir être utilisé comme entrée pour une carte.
ce qui signifie que chaque élément du tableau sera transformé en un autre tableau avec 2 éléments; la touche sélectionnée en tant que premier élément et l'ensemble de l' article initial en tant que deuxième élément, ce qu'on appelle une entrée (ex. entrées de tableau , les entrées de la carte ). Et voici le document officiel avec un exemple montrant comment ajouter des entrées de tableau dans le constructeur Map.
Exemple lorsque la clé est en place :
Deuxièmement, nous passons ce tableau modifié au constructeur Map et voici la magie qui se produit. La carte éliminera les valeurs des clés en double, en ne conservant que la dernière valeur insérée de la même clé. Remarque : la carte conserve l'ordre d'insertion. ( vérifier la différence entre la carte et l'objet )
Troisièmement, nous utilisons les valeurs de la carte pour récupérer les éléments d'origine, mais cette fois sans doublons.
Et la dernière consiste à ajouter ces valeurs dans un nouveau tableau afin qu'il puisse ressembler à la structure initiale et retourner cela:
la source
id
. La question nécessite que l'objet entier soit unique dans tous les domaines tels queplace
etname
Voici une autre option pour le faire en utilisant des méthodes d'itération de tableau si vous avez besoin d'une comparaison uniquement par un champ d'un objet:
la source
un paquebot est ici
la source
Si vous pouvez attendre pour éliminer les doublons après tous les ajouts, l'approche typique consiste d'abord à trier le tableau, puis à éliminer les doublons. Le tri évite l'approche N * N consistant à analyser le tableau pour chaque élément lorsque vous les parcourez.
La fonction "éliminer les doublons" est généralement appelée unique ou uniq . Certaines implémentations existantes peuvent combiner les deux étapes, par exemple, l'uniq du prototype
Ce post a quelques idées à essayer (et certaines à éviter :-)) si votre bibliothèque n'en a pas déjà ! Personnellement, je trouve celui-ci le plus simple:
la source
function(_a,_b){return _a.a===_b.a && _a.b===_b.b;}
alors le tableau ne sera pas trié.La manière la plus simple est d'utiliser
filter
:la source
id
. La question nécessite que l'objet entier soit unique dans tous les domaines tels queplace
etname
C'est une façon générique de le faire: vous passez une fonction qui teste si deux éléments d'un tableau sont considérés comme égaux. Dans ce cas, il compare les valeurs des propriétés
name
etplace
des deux objets à comparer.Réponse ES5
Réponse originale ES3
la source
Pour en ajouter un de plus à la liste. Utilisation d'ES6 et
Array.reduce
avecArray.find
.Dans cet exemple, filtrer les objets en fonction d'une
guid
propriété.Extension de celui-ci pour permettre la sélection d'une propriété et la compresser en une seule doublure:
Pour l'utiliser, passez un tableau d'objets et le nom de la clé que vous souhaitez déduper comme valeur de chaîne:
la source
Vous pouvez également utiliser
Map
:Échantillon complet:
Résultat:
la source
Dang, les enfants, écrasons cette chose, pourquoi pas nous?
la source
id
. La question nécessite que l'objet entier soit unique dans tous les domaines tels queplace
etname
place
etname
aujourd'hui. Quiconque lit ce fil recherche un moyen optimal de dédoubler une liste d'objets, et c'est une façon compacte de le faire.Une solution TypeScript
Cela supprimera les objets en double et préservera également les types des objets.
la source
Considérant
lodash.uniqWith
la source
Une autre option serait de créer une fonction indexOf personnalisée, qui compare les valeurs de la propriété que vous avez choisie pour chaque objet et envelopper cela dans une fonction de réduction.
la source
lodash.isequal
package npm en tant que comparateur d'objet léger pour effectuer un filtrage de tableau unique ... par exemple, un tableau distinct d'objets. Juste échangé auif (_.isEqual(a[i], b)) {
lieu de regarder @ une seule propriétéOne-liner utilisant ES6 et
new Map()
.Détails:-
.map()
sur la liste de données et en convertissant chaque objet individuel en un[key, value]
tableau de paires (longueur = 2), le premier élément (clé) serait lestringified
version de l'objet et le second (valeur) serait unobject
lui-même.new Map()
aurait la clé commestringified
objet et tout ajout de clé entraînerait la substitution de la clé déjà existante..values()
donnerait MapIterator avec toutes les valeurs d'une carte (obj
dans notre cas)spread ...
opérateur pour donner un nouveau tableau avec les valeurs de l'étape ci-dessus.la source
Voici une solution pour es6 où vous ne souhaitez conserver que le dernier élément. Cette solution est fonctionnelle et conforme au style Airbnb.
la source
removeDuplicates () prend un tableau d'objets et retourne un nouveau tableau sans aucun objet en double (basé sur la propriété id).
Résultat attendu:
Tout d'abord, nous définissons la valeur de la variable uniq sur un objet vide.
Ensuite, nous filtrons à travers le tableau d'objets. Le filtre crée un nouveau tableau avec tous les éléments qui réussissent le test implémenté par la fonction fournie.
Ci-dessus, nous utilisons la fonctionnalité de court-circuitage de &&. Si le côté gauche du && prend la valeur true, il renvoie la valeur à droite du &&. Si le côté gauche est faux, il renvoie ce qui se trouve sur le côté gauche du &&.
Pour chaque objet (obj), nous vérifions uniq pour une propriété nommée la valeur de obj.id (dans ce cas, à la première itération, il vérifierait la propriété «1».) Nous voulons le contraire de ce qu'il retourne (soit vrai ou faux) c'est pourquoi nous utilisons le! dans! uniq [obj.id]. Si uniq a déjà la propriété id, elle renvoie true qui est évaluée à false (!) En disant à la fonction de filtre de ne PAS ajouter cet obj. Cependant, s'il ne trouve pas la propriété obj.id, il renvoie false qui est ensuite évalué à true (!) Et renvoie tout à droite du &&, ou (uniq [obj.id] = true). Il s'agit d'une valeur véridique, indiquant à la méthode de filtrage d'ajouter cet obj au tableau renvoyé, et elle ajoute également la propriété {1: true} à uniq. Cela garantit qu'aucune autre instance obj avec le même identifiant ne sera ajoutée à nouveau.
la source
la source
Je crois qu'une combinaison de
reduce
avecJSON.stringify
pour comparer parfaitement les objets et ajouter sélectivement ceux qui ne sont pas déjà dans l'accumulateur est une manière élégante.Gardez à l'esprit que cela
JSON.stringify
pourrait devenir un problème de performances dans les cas extrêmes où le tableau a de nombreux objets et ils sont complexes, MAIS pour la majorité du temps , c'est le chemin le plus court pour aller à mon humble avis.Une autre façon d'écrire la même chose (mais moins efficace):
la source
Continuer à explorer les moyens d'ES6 de supprimer les doublons du tableau d'objets: définir l'
thisArg
argument deArray.prototype.filter
ànew Set
fournit une alternative décente:Cependant, il ne fonctionnera pas avec les fonctions fléchées
() =>
, car ilthis
est lié à leur portée lexicale.la source
es6 magic in one line ... lisible à ça!
la source
Solution simple avec les méthodes d'assistance de tableau ES6 «réduire» et «trouver»
Fonctionne efficacement et parfaitement bien!
la source
Si cela ne vous dérange pas que votre tableau unique soit trié par la suite, ce serait une solution efficace:
De cette façon, vous n'avez qu'à comparer l'élément actuel avec l'élément précédent dans le tableau. Trier une fois avant filtering (
O(n*log(n))
) est moins cher que de rechercher un doublon dans le tableau entier pour chaque élément du tableau (O(n²)
).la source
C'est un moyen simple de supprimer la duplicité d'un tableau d'objets.
Je travaille beaucoup avec des données et cela m'est utile.
imprimera dans la console:
la source
str est un tableau d'objets. Il existe des objets ayant la même valeur (ici un petit exemple, il y a deux objets ayant le même item_id que 2). check (id) est une fonction qui vérifie si un objet ayant le même item_id existe ou non. s'il existe, retournez false sinon retournez true. Selon ce résultat, poussez l'objet dans un nouveau tableau obj La sortie du code ci-dessus est
[{"item_id":1},{"item_id":2}]
la source
Avez-vous entendu parler de la bibliothèque Lodash? Je vous recommande cet utilitaire, lorsque vous ne voulez pas vraiment appliquer votre logique au code, et utiliser du code déjà présent qui est optimisé et fiable.
Pensez à créer un tableau comme celui-ci
Notez que si vous souhaitez conserver un attribut unique, vous pouvez très bien le faire en utilisant la bibliothèque lodash. Ici, vous pouvez utiliser _.uniqBy
Cette méthode est similaire à _.uniq (qui renvoie une version sans doublon d'un tableau, dans laquelle seule la première occurrence de chaque élément est conservée), sauf qu'elle accepte l'itérate qui est invoquée pour chaque élément du tableau pour générer le critère par lequel l'unicité est calculée.
Ainsi, par exemple, si vous souhaitez renvoyer un tableau ayant un attribut unique de «place»
De même, si vous voulez un attribut unique comme «nom»
J'espère que cela t'aides.
À votre santé!
la source