Get list of duplicate objects in an array of objects
You can use Array#reduce
to make a counter lookup table based on the id
key, then use Array#filter
to remove any items that appeared only once in the lookup table. Time complexity is 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]));
Let's say you have:
arr = [ { id:10, name: 'someName1' }, { id:10, name: 'someName2' }, { id:11, name: 'someName3' }, { id:12, name: 'someName4' }]
So, to get unique items:
unique = arr .map(e => e['id']) .map((e, i, final) => final.indexOf(e) === i && i) .filter(obj=> arr[obj]) .map(e => arr[e]);
Then, result will be
unique = [ { id:10, name: 'someName1' }, { id:11, name: 'someName3' }, { id:12, name: 'someName4' }]
And, to get duplicate ids:
duplicateIds = arr .map(e => e['id']) .map((e, i, final) => final.indexOf(e) !== i && i) .filter(obj=> arr[obj]) .map(e => arr[e]["id"])
List of IDs will be
duplicateIds = [10]
Thus, to get duplicates objects:
duplicate = arr.filter(obj=> dublicateIds.includes(obj.id));
Now you have it:
duplicate = [ { id:10, name: 'someName1' }, { id:10, name: 'someName2' }]
You haven't clarified whether two objects with different ids, but the same "name" count as a duplicate. I will assume those do not count as a duplicate; in other words, only objects with the same id will count as duplicate.
let ids = {};let dups = [];values.forEach((val)=> { if (ids[val.id]) { // we have already found this same id dups.push(val) } else { ids[val.id] = true; }})return dups;