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: et j'ai besoin de trouver le même type code> et même
id code>, 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 () code> mais pas Succès, comment puis-je résoudre ce problème?
Merci !!! p> p>
3 Réponses :
Vous pouvez utiliser p> .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:
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));
Pourquoi Set () code> 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?) code>
@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
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));
Le .Ajouter code> et
.HAS code> La méthode n'accepte qu'une seule valeur. Donc si le deuxième objet a le même type code> code> mais différent
ID code> au premier, il sera toujours supprimé
Il est possible de grouper par des propriétés telles que un exemple: p> p> 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:
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));
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.