I currently have an array of objects that is filtered based on unique IDs and unique Names being together:
Initial input:
const data = [
{
id: 1234,
name: "Name1"
},
{
id: 1234,
name: "Name1"
},
{
id: 1234,
name: "Name2"
},
{
id: 1234,
name: null
},
{
id: 5678,
name: "Name3"
},
{
id: 5678,
name: "Name3"
},
{
id: 5678,
name: null
},
{
id: 9999,
name: null
},
{
id: 9999,
name: null
},
];
data.filter((value, index, self) => {
return (
self.findIndex(
(v) =>
v.id === value.id &&
v.name=== value.name
) === index
);
});
[
{
id: 1234
name: "Name1"
},
{
id: 1234
name: "Name2"
},
{
id: 1234
name: null
},
{
id: 5678
name: null
},
{
id: 5678
name: "Name3"
},
{
id: 9999
name: null
},
]
However, some Ids do not have any duplicates and I want to remove all the null name associated objects EXCEPT where the id is not a duplicate and to look like the following:
[
{
id: 1234
name: "Name1"
},
{
id: 1234
name: "Name2"
},
{
id: 5678
name: "Name3"
},
{
id: 9999
name: null
},
]
At the moment the duplicated Ids with null names still exist.
I kept the filtering part you implemented as an intermediate output. using that i got a count for each id. then using that i filtered out from the intermediate array where if the has count > 1 and has a null name i remove it.
const data = [{id: 1234,name: "Name1"},{id: 1234,name: "Name1"},{id: 1234,name: "Name2"},{id: 1234,name: null},{id: 5678,name: "Name3"},{
id: 5678,name: "Name3"},{id: 5678,name: null},{id: 9999,name: null},{id: 9999,name: null},];
//filtering out duplicates
let a = data.filter((value, index, self) => {
return (
self.findIndex(
(v) =>
v.id === value.id &&
v.name=== value.name
) === index
);
});
//get count for ids in partially filtered
let idcount = a.reduce((acc,curr) => {
if(!acc[curr.id])acc[curr.id] = 0
acc[curr.id] += 1
return acc;
},{})
//remove the duplicate nulls
let final = a.filter((el) => {
return !(idcount[el.id]>1 && el.name===null)
})
console.log(final)