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

Bibin Jaimon Points 70
str =[
{"item_id":1},
{"item_id":2},
{"item_id":2}
]

obj =[]
for (x in str){
    if(check(str[x].item_id)){
        obj.push(str[x])
    }   
}
function check(id){
    flag=0
    for (y in obj){
        if(obj[y].item_id === id){
            flag =1
        }
    }
    if(flag ==0) return true
    else return false

}
console.log(obj)

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 comme 2). vérifier(id) est une fonction qui vérifie si un objet ayant le même item_id existe ou non. S'il existe, elle retourne false sinon elle retourne true. En fonction de ce résultat, on pousse l'objet dans un nouveau tableau obj. Le résultat du code ci-dessus est [{"item_id":1},{"item_id":2}]

1voto

Mayank Gangwal Points 21

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.

Envisagez de créer un tableau comme celui-ci

things.thing.push({place:"utopia",name:"unicorn"});
things.thing.push({place:"jade_palace",name:"po"});
things.thing.push({place:"jade_palace",name:"tigress"});
things.thing.push({place:"utopia",name:"flying_reindeer"});
things.thing.push({place:"panda_village",name:"po"});

Notez que si vous souhaitez qu'un attribut reste unique, vous pouvez très bien le faire en utilisant la bibliothèque lodash. Ici, vous pouvez utiliser _.uniqBy

.uniqBy(tableau, [iteratee= .identité])

Cette méthode est comme _.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'il accepte iteratee qui est invoqué pour chaque élément du tableau afin de générer le critère par lequel l'unicité est calculée.

Ainsi, par exemple, si vous voulez renvoyer un tableau ayant l'attribut unique "lieu".

_.uniqBy(things.thing, 'place')

De même, si vous voulez que l'attribut unique soit 'nom'.

_.uniqBy(choses.chose, 'nom')

J'espère que cela vous aidera.

A la vôtre !

1voto

Amardeep Bhowmick Points 3472
  • Cette solution est générique pour tout type d'objet et vérifie tous les éléments suivants (key, value) de la Object dans le tableau.
  • Utiliser un objet temporaire comme une table de hachage pour voir si l'ensemble de la Object était toujours présent en tant que clé.
  • Si la représentation de la chaîne de caractères de l Object est trouvé, alors cet élément est retiré du tableau.

    var arrOfDup = [{'id':123, 'name':'name', 'desc':'some desc'}, {'id':125, 'name':'another name', 'desc':'another desc'}, {'id':123, 'name':'name', 'desc':'some desc'}, {'id':125, 'name':'another name', 'desc':'another desc'}, {'id':125, 'name':'another name', 'desc':'another desc'}];

    function removeDupes(dupeArray){ let temp = {}; let tempArray = JSON.parse(JSON.stringify(dupeArray)); dupeArray.forEach((item, pos) => { if(temp[JSON.stringify(item)]){ tempArray.pop(); }else{ temp[JSON.stringify(item)] = item; } }); return tempArray; }

    arrOfDup = removeDupes(arrOfDup);

    arrOfDup.forEach((item, pos) => { console.log(item in array at position ${pos} is ${JSON.stringify(item)}); });

1voto

wLc Points 750
const uniqueElements = (arr, fn) => arr.reduce((acc, v) => {
    if (!acc.some(x => fn(v, x))) { acc.push(v); }
    return acc;
}, []);

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

const unique = uniqueElements(stuff, (a,b) => a.place === b.place && a.name === b.name );

//console.log( unique );

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

1voto

TheDarkIn1978 Points 7794

Vous pouvez convertir les objets du tableau en chaînes de caractères pour pouvoir les comparer, ajouter les chaînes de caractères à un ensemble pour que les doublons comparables soient automatiquement supprimés, puis reconvertir chacune des chaînes de caractères en objets.

Ce n'est peut-être pas aussi performant que d'autres réponses, mais c'est lisible.

const things = {};

things.thing = [];
things.thing.push({place:"here",name:"stuff"});
things.thing.push({place:"there",name:"morestuff"});
things.thing.push({place:"there",name:"morestuff"});

const uniqueArray = (arr) => {

  const stringifiedArray = arr.map((item) => JSON.stringify(item));
  const set = new Set(stringifiedArray);

  return Array.from(set).map((item) => JSON.parse(item));
}

const uniqueThings = uniqueArray(things.thing);

console.log(uniqueThings);

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