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.

1 Answers1

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);
Emilien
  • 614
  • 1
  • 5
  • 17