886 votes

Comment supprimer tous les doublons d'un tableau d'objets ?

J'ai un objet qui contient un tableau d'objets.

obj = {};

obj.arr = new Array();

obj.arr.push({place:"here",name:"stuff"});
obj.arr.push({place:"there",name:"morestuff"});
obj.arr.push({place:"there",name:"morestuff"});

Je me demande quelle est la meilleure méthode pour supprimer les objets en double d'un tableau. Par exemple, obj.arr deviendrait...

{place:"here",name:"stuff"},
{place:"there",name:"morestuff"}

0 votes

Voulez-vous dire comment empêcher qu'une table de hachage/un objet avec tous les mêmes paramètres soit ajouté à un tableau ?

9 votes

Mathew -> S'il est plus simple d'empêcher un objet en double d'être ajouté au tableau en premier lieu, au lieu de le filtrer plus tard, oui, ce serait bien aussi.

18 votes

Je suis toujours surpris de voir comment les gens nomment leurs variables. Parfois, je pense qu'ils veulent vraiment rendre les choses inutilement compliquées. La prochaine étape sera aaaaa.aaaa.push(...) :)

2voto

Leonid Pyrlia Points 1072

Poursuite de l'exploration des méthodes ES6 pour supprimer les doublons d'un tableau d'objets : réglage thisArg argument de Array.prototype.filter à new Set fournit une alternative décente :

const things = [
  {place:"here",name:"stuff"},
  {place:"there",name:"morestuff"},
  {place:"there",name:"morestuff"}
];

const filtered = things.filter(function({place, name}) {

  const key =`${place}${name}`;

  return !this.has(key) && this.add(key);

}, new Set);

console.log(filtered);

Cependant, il ne fonctionnera pas avec les fonctions de flèche () => comme this est lié à leur portée lexicale.

2voto

Josiah Coad Points 194

La magie d'es6 en une ligne... et lisible !

// returns the union of two arrays where duplicate objects with the same 'prop' are removed
const removeDuplicatesWith = (a, b, prop) => {
  a.filter(x => !b.find(y => x[prop] === y[prop]));
};

2voto

Suhail AKhtar Points 573

Source :

JSFiddle

Ceci supprimera l'objet dupliqué sans passer de clé.

uniqueArray = a => [...new Set(a.map(o => JSON.stringify(o)))].map(s => JSON.parse(s));

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];

var unique = uniqueArray(objects);
console.log('Original Object',objects);
console.log('Unique',unique);

uniqueArray = a => [...new Set(a.map(o => JSON.stringify(o)))].map(s => JSON.parse(s));

    var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];

    var unique = uniqueArray(objects);
    console.log(objects);
    console.log(unique);

2voto

crmackey Points 319

Si vous voulez strictement supprimer les doublons sur la base d'une seule propriété, vous pouvez reduce le tableau en un objet basé sur le place puisque l'objet ne peut avoir que des clés uniques, vous pouvez alors simplement obtenir la propriété values pour revenir à un tableau :

const unique = Object.values(things.thing.reduce((o, t) => ({ ...o, [t.place]: t }), {}))

2voto

vsync Points 11280

Je crois qu'une combinaison de reduce avec JSON.stringify à parfaitement comparer les objets et sélectivement L'ajout de ceux qui ne sont pas déjà dans l'accumulateur est un moyen élégant.

Gardez à l'esprit que JSON.stringify peut devenir un problème de performance dans les cas extrêmes où la matrice a beaucoup de Objets et ils sont complexes, MAIS pour la majorité du temps C'est le chemin le plus court, à mon avis.

var collection= [{a:1},{a:2},{a:1},{a:3}]

var filtered = collection.reduce((filtered, item) => {
  if( !filtered.some(filteredItem => JSON.stringify(filteredItem) == JSON.stringify(item)) )
    filtered.push(item)
  return filtered
}, [])

console.log(filtered)

Une autre façon d'écrire la même chose (mais moins efficace) :

collection.reduce((filtered, item) => 
  filtered.some(filteredItem => 
    JSON.stringify(filteredItem ) == JSON.stringify(item)) 
      ? filtered
      : [...filtered, item]
, [])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X