0

I have a situation where i need to find the duplicate element in array of object. Object contains 4 properties

{
id:"1",
userName:"userName",
name:"name1",
address:"address!"
}

My array of object looks like this.

[{
id:"1",
userName:"userName",
name:"name1",
address:"address!"
},{
id:"1",
userName:"userName",
name:"name2",
address:"address!"
},{
id:"2",
userName:"userName2",
name:"name3",
address:"address!"
},{
id:"3",
userName:"userName3",
name:"name4",
address:"address!"
},{
id:"4",
userName:"userName4",
name:"name5",
address:"address!"
}]

Rule for 2 object to be equal is id and userName should be equal for respective objects. That object should be marked as duplicate and removed only object should remain if there are duplicate object. In above array after removing the duplicate element result should be like this

[{
    id:"1",
    userName:"userName",
    name:"name1",
    address:"address!"
    },{
    id:"2",
    userName:"userName2",
    name:"name1",
    address:"address!"
    },{
    id:"3",
    userName:"userName3",
    name:"name1",
    address:"address!"
    },{
    id:"4",
    userName:"userName4",
    name:"name1",
    address:"address!"
    }]

if the input is like

[{
    id:"1",
    userName:"",
    name:"name1",
    address:"address!"
    },{
    id:"2",
    userName:"",
    name:"name1",
    address:"address!"
    },{
    id:"3",
    userName:"userName3",
    name:"name1",
    address:"address!"
    },{
    id:"3",
    userName:"userName3",
    name:"name1",
    address:"address!"
    }]

out put is like below

[{
    id:"1",
    userName:"",
    name:"name1",
    address:"address!"
    },{
    id:"2",
    userName:"",
    name:"name1",
    address:"address!"
    },{
    id:"3",
    userName:"userName3",
    name:"name1",
    address:"address!"
    }]

Please suggest is there any easy method which can do this in typescript?

I tried

_.uniq(contacts, (user) => {
      return user.id && user.userName;
    });

This seems to be not working as expected.

3
  • stackoverflow.com/questions/26306415/… Commented Dec 22, 2022 at 19:52
  • Your lodash is so close. should have been return user.id + user.userName; Commented Dec 22, 2022 at 19:54
  • Object.values(input.reduce((acc, x) => { const key = `${x.id}_${x.userName}`; if (!acc[key]) acc[key] = x; return acc; }, {})) Commented Dec 22, 2022 at 20:01

1 Answer 1

2

One way to do it would be by using reduce().

Basically what the code below does is:

  • starts with an empty output array
  • for each element of the input test if it's already in the output (based on userName and id)
  • if it isn't, then add it, if it is, then do nothing.

Hope this helps.

const input = [{
id:"1",
userName:"userName",
name:"name1",
address:"address!"
},{
id:"1",
userName:"userName",
name:"name2",
address:"address!"
},{
id:"2",
userName:"userName2",
name:"name3",
address:"address!"
},{
id:"3",
userName:"userName3",
name:"name4",
address:"address!"
},{
id:"4",
userName:"userName4",
name:"name5",
address:"address!"
}]

const output = input.reduce(
  (acc, item) =>
    acc.find((e) => e.userName === item.userName && e.id === item.id)
      ? acc
      : acc.concat([item]),
  []
);

console.log(output);

Sign up to request clarification or add additional context in comments.

1 Comment

Could done with less code with an object and object.values

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.