0
votes

Comment puis-je vérifier si la gamme d'objets a dupliquer des valeurs de propriété avec plus de propriétés?

J'ai la recherche Stackoverflow et j'ai trouvé le Réponse entendre, mais pas résoudre mon problème. Mon problème est, mon tableau comme ceci: xxx

et j'ai besoin de trouver le même type et même id , puis reconnaître est un objet en double ( arr [0] andr [1] est dupliqué mais arr [0] et arr [2] n'est pas), j'ai essayé avec ES6 certains (), chaque (), ensemble () mais pas Succès, comment puis-je résoudre ce problème? Merci !!!


2 commentaires

Quel est votre résultat attendu? Un booléen? Le tableau avec les doublons enlevés?


Oui, j'ai juste besoin de résultat booléen.


3 Réponses :


3
votes

Vous pouvez utiliser .map () code> pour mapper chaque objet sur une chaîne. Chaque chaîne prend la forme de type-id code> pour cet objet. Ensuite, en utilisant un définir code>, vous pouvez supprimer toutes les chaînes en double. Vous pouvez ensuite vérifier si la taille de réglage est égale à la longueur de la matrice pour déterminer s'il y a des doublons ou non dans la matrice:

p>

const containsDups = arr => new Set(arr.map(({type, id}) => `${type}-${id}`)).size !== arr.length;

const arr = [{type: 1, id: 1, name:'aa'},{type: 1, id: 1, name:'bb'},{type: 2, id: 1, name:'cc'}];
console.log(containsDups(arr));


2 commentaires

Pourquoi Set () ne peut pas déterminer les doupleurs d'objet? J'ai essayé let Set = nouvel ensemble (); set.add ({type: 1, id: 1}); set.add ( {Type: 1, ID: 1}); Console. Journal (Set.Size) // 2 (Pourquoi?)


@yang parce que les objets sont des types de référence, de sorte que deux objets ne sont pas identiques si elles sont des types de référence différents. Alors {}! = {} Retournera vrai. Étant donné que l'égalité d'objet ne peut pas être déterminée comme ceci, l'ensemble ne peut également pas déterminer lorsque deux objets sont identiques. Donc, vous devez utiliser une chaîne, où l'égalité où travail



0
votes

Vous pouvez utiliser SET:

SET est un nouvel objet de données introduit dans ES6. Parce que Set vous permet seulement de stocker des valeurs uniques p>

p>

const seen = new Set();

const arr = [
  {type: 1, id: 1, name:'aa'},
  {type: 1, id: 1, name:'bb'},
  {type: 2, id: 1, name:'cc'}
];

const filteredArr = arr.filter((el, index) => {
  const duplicate = seen.has(el.type, el.id);
  seen.add(el.type, el.id);
  console.log('index: '+ index +' is duplicate: '+ duplicate);
  return !duplicate;    //  if you just need a boolean, this is what you are looking for.
});

console.log('new array: ' + JSON.stringify(filteredArr));


1 commentaires

Le .Ajouter et .HAS La méthode n'accepte qu'une seule valeur. Donc si le deuxième objet a le même type mais différent ID au premier, il sera toujours supprimé



0
votes

Il est possible de grouper par des propriétés telles que type code> et id code>, puis vérifier si noms code> plus que 1 code >. Si oui, cela signifie qu'il existe au moins un duplicata: xxx pré>

un exemple: p>

p>

let arr = [{type: 1, id: 1, name:'aa'},{type: 1, id: 1, name:'bb'},{type: 2, id: 1, name:'cc'}]

const result = [...arr.reduce((r, o) => {
    const key = o.type + '-' + o.id;
    const item = r.get(key) || Object.assign({}, o, {
        names: []
    });
    item.names.push(o.name);
    return r.set(key, item);
}, new Map).values()];

console.log(`Is there duplicates: `, result.some(s => s.names.length > 1));


0 commentaires