Reputation: 751
I found several references about how to delete duplicate values in object like this, this, this... In all these examples (and in others that I've found) are for simple objects, but my case is more "complex".
I have an array where each index has your values and an object inside. I create a simple example for explanation:
var data = [
{
"name": "Kyle",
"item": [
{
"id": 1,
"name": "name1"
},
{
"id": 2,
"name": "name2"
},
{
"id": 3,
"name": "name3"
},
{
"id": 2,
"name": "name2"
}
{
"id": 3,
"name": "name3"
}
]
},
{
"name": "Liza",
"item": [
{
"id": 1,
"name": "name1"
},
{
"id": 1,
"name": "name1"
},
{
"id": 2,
"name": "name2"
}
]
},
{
"name": "John",
"item": [
{
"id": 1,
"name": "name1"
},
{
"id": 1,
"name": "name1"
},
{
"id": 4,
"name": "name4"
},
{
"id": 4,
"name": "name4"
},
{
"id": 2,
"name": "name2"
}
]
},
{
"name": "Melissa",
"item": [
{
"id": 2,
"name": "name2"
}
]
}
]
How you can see, inside my item
objects I've duplicate values... I would like to remove this duplicate values inside my objects.
One way to do this (which I thought) was do it making a copy of my list and using a forEach
/map
/filter
but I don't know how to do it.
I tried this, but not works:
let dataCopy = data;
dataCopy.forEach(dataItem => {
listPrev.forEach(dataPrev => {
//??
//and or...
if(dataPrev.item.id == dataItem.item.id){
//??
}
})
})
I'm trying to get this kind of return:
var data = [
{
"name": "Kyle",
"item": [
{
"id": 1,
"name": "name1"
},
{
"id": 2,
"name": "name2"
},
{
"id": 3,
"name": "name3"
},
]
},
{
"name": "Liza",
"item": [
{
"id": 1,
"name": "name1"
}
{
"id": 2,
"name": "name2"
}
]
},
{
"name": "John",
"item": [
{
"id": 1,
"name": "name1"
},
{
"id": 4,
"name": "name4"
},
{
"id": 2,
"name": "name2"
}
]
},
{
"name": "Melissa",
"item": [
{
"id": 2,
"name": "name2"
}
]
}
]
How I can do it? Someone can help me?
Upvotes: 0
Views: 60
Reputation: 1688
you can write a utility function then map the collection like follow:
var dedupeBy = (arr, by) =>
Object.values(arr.reduce((a, item) => ({ ...a, [item[by]]: item }), {}));
data.map((person) => ({ ...person, item: dedupeBy(person.item, 'name') }));
Upvotes: 0
Reputation: 104775
Simple forEach
and filter
will do:
data.forEach(d => {
d.item = d.item.filter((item, index, self) => {
return index === self.findIndex(z => z.id == item.id)
});
});
Upvotes: 1
Reputation: 191946
Iterate the array with Array.map()
, and apply an array unique function to each item
array:
const data = [{"name":"Kyle","item":[{"id":1,"name":"name1"},{"id":2,"name":"name2"},{"id":3,"name":"name3"},{"id":2,"name":"name2"},{"id":3,"name":"name3"}]},{"name":"Liza","item":[{"id":1,"name":"name1"},{"id":1,"name":"name1"},{"id":2,"name":"name2"}]},{"name":"John","item":[{"id":1,"name":"name1"},{"id":1,"name":"name1"},{"id":4,"name":"name4"},{"id":4,"name":"name4"},{"id":2,"name":"name2"}]},{"name":"Melissa","item":[{"id":2,"name":"name2"}]}];
const uniqueById = arr => Object.values(arr.reduce((r, o) => ({
[o.id]: o,
...r
}), {}));
const result = data.map(o => ({
...o,
item: uniqueById(o.item)
}));
console.log(result);
Upvotes: 0