javascript - Få liste over dupliserte objekter i en matrise av objekter


Jeg prøver å finne dupliserte objekter i et array av objekter. La oss si at objektet er som nedenfor.

values = [
  { id: 10, name: 'someName1' },
  { id: 10, name: 'someName2' },
  { id: 11, name: 'someName3' },
  { id: 12, name: 'someName4' }
];

Dupliserte objekter bør returneres som nedenfor:

duplicate = [
  { id: 10, name: 'someName1' },
  { id: 10, name: 'someName2' }
];

Svar #1

Du kan bruke Array#reduce for å lage en telleoppslagstabell basert på id-nøkkelen, og deretter bruke Array#filter for å fjerne alle elementer som kun dukket opp én gang i oppslagstabellen. Tidskompleksiteten er O(n).

const values = [{id: 10, name: 'someName1'}, {id: 10, name: 'someName2'}, {id: 11, name:'someName3'}, {id: 12, name: 'someName4'}];

const lookup = values.reduce((a, e) => {
  a[e.id] = ++a[e.id] || 0;
  return a;
}, {});

console.log(values.filter(e => lookup[e.id]));

Du kan forenkle dette hvis nettleseren din støtter Object.groupBy:

const values = [{id: 10, name: 'someName1'}, {id: 10, name: 'someName2'}, {id: 11, name:'someName3'}, {id: 12, name: 'someName4'}];

const lookup = Object.groupBy(values, e => e.id);
console.log(values.filter(e => lookup[e.id].length > 1));

Svar #2

La oss si at du har:

arr = [
    { id:10, name: 'someName1' },
    { id:10, name: 'someName2' },
    { id:11, name: 'someName3' },
    { id:12, name: 'someName4' }
]

Så, for å få unike gjenstander:

unique = arr
     .map(e => e['id'])
     .map((e, i, final) => final.indexOf(e) === i && i)
     .filter(obj=> arr[obj])
     .map(e => arr[e]);

Da vil resultatet være

unique = [
     { id:10, name: 'someName1' },
     { id:11, name: 'someName3' },
     { id:12, name: 'someName4' }
]

Og, for å få dupliserte id-er:

duplicateIds = arr
     .map(e => e['id'])
     .map((e, i, final) => final.indexOf(e) !== i && i)
     .filter(obj=> arr[obj])
     .map(e => arr[e]["id"])

Liste over ID-er vil være

duplicateIds = [10]

Så, for å få dupliserte objekter:

duplicate = arr.filter(obj=> dublicateIds.includes(obj.id));

Nå har du det:

duplicate = [
    { id:10, name: 'someName1' },
    { id:10, name: 'someName2' }
]

Takk https://reactgo.com/removeduplicateobjects/

Relaterte artikler