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(...) :)

1voto

KJ Sudarshan Points 378

Solution simple avec les méthodes d'aide ES6 "reduce" et "find" pour les tableaux.

Fonctionne efficacement et parfaitement bien !

"use strict";

var 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"
});

// the logic is here

function removeDup(something) {
    return something.thing.reduce(function (prev, ele) {
        var found = prev.find(function (fele) {
            return ele.place === fele.place && ele.name === fele.name;
        });
        if (!found) {
            prev.push(ele);
        }
        return prev;
    }, []);
}
console.log(removeDup(things));

1voto

TBE Points 885

Pour une recherche de solution lisible et simple, c'est ma version :

    function removeDupplicationsFromArrayByProp(originalArray, prop) {
        let results = {};
        for(let i=0; i<originalArray.length;i++){
            results[originalArray[i][prop]] = originalArray[i];
        }
        return Object.values(results);
    }

1voto

Rahul Dwivedi Points 113

Mes deux centimes ici. Si vous savez que les propriétés sont dans le même ordre, vous pouvez stringifier les éléments et supprimer les doublons du tableau et analyser à nouveau le tableau. Quelque chose comme ça :

var 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"});

let stringified = things.thing.map(i=>JSON.stringify(i));
let unique =  stringified.filter((k, idx)=> stringified.indexOf(k) === idx)
                         .map(j=> JSON.parse(j))
console.log(unique);

1voto

Kishor Ahir Points 41
  • Suppression des doublons dans un tableau d'objets en react js (fonctionne parfaitement)

      let optionList = [];
          var dataArr = this.state.itemArray.map(item => {
              return [item.name, item]
          });
      var maparr = new Map(dataArr);
    
      var results = [...maparr.values()];
    
      if (results.length > 0) {
           results.map(data => {
           if (data.lead_owner !== null) {
                optionList.push({ label: data.name, value: 
                data.name });
           }
           return true;
         });
     }
     console.log(optionList)

1voto

Vous pourriez utiliser Set ainsi que Filter pour y parvenir,

var arrObj = [{
  a: 1,
  b: 2
}, {
  a: 1,
  b: 1
}, {
  a: 1,
  b: 2
}];

var duplicateRemover = new Set();

var distinctArrObj = arrObj.filter((obj) => {
  if (duplicateRemover.has(JSON.stringify(obj))) return false;
  duplicateRemover.add(JSON.stringify(obj));
  return true;
});

console.log(distinctArrObj);

Set est une collection unique de types primitifs, et ne fonctionnera donc pas directement sur les objets, cependant JSON.stringify le convertira en un type primitif ie. String ainsi, nous pouvons filtrer.

Si vous voulez supprimer les doublons en vous basant uniquement sur une clé particulière, par exemple. key vous pourriez remplacer JSON.stringify(obj) avec obj.key

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