Reputation: 3785
How to find unique value with id in JavaScript? right now I'm getting just value.
I'm getting:-
[
"Care One",
"Care Two"
]
I need:-
[
{
"Source_ID": 1,
"SourceName_CR": "Care One"
},
{
"Source_ID": 2,
"SourceName_CR": "Care Two"
}
]
My code:-
const body = [
{
Field_ID: 1,
FieldName_CR: "First Name",
Source_ID: 1,
SourceName_CR: "Care One"
},
{
Field_ID: 2,
FieldName_CR: "Last Name",
Source_ID: 1,
SourceName_CR: "Care One"
}, {
Field_ID: 3,
FieldName_CR: "Phone",
Source_ID: 2,
SourceName_CR: "Care Two"
},
{
Field_ID: 4,
FieldName_CR: "Email",
Source_ID: 2,
SourceName_CR: "Care Two"
}, ];
console.log([...new Set(body.map(item => item.SourceName_CR))]);
Upvotes: 2
Views: 57
Reputation: 197
const body = [
{
Field_ID: 1,
FieldName_CR: "First Name",
Source_ID: 1,
SourceName_CR: "Care One"
},
{
Field_ID: 2,
FieldName_CR: "Last Name",
Source_ID: 1,
SourceName_CR: "Care One"
}, {
Field_ID: 3,
FieldName_CR: "Phone",
Source_ID: 2,
SourceName_CR: "Care Two"
},
{
Field_ID: 4,
FieldName_CR: "Email",
Source_ID: 2,
SourceName_CR: "Care Two"
}, ];
const key = 'SourceName_CR';
const uniqValues = [...new Map(body.map(item =>[item[key], item])).values()];
const onlyIDandNames=uniqValues.map((item)=>({Source_ID:item?.Source_ID,SourceName_CR:item?.SourceName_CR}))
console.log(uniqValues)
console.log(onlyIDandNames)
Upvotes: 2
Reputation: 13245
This would also work:
const body = [ { Field_ID: 1, FieldName_CR: "First Name", Source_ID: 1, SourceName_CR: "Care One", }, { Field_ID: 2, FieldName_CR: "Last Name", Source_ID: 1, SourceName_CR: "Care One", }, { Field_ID: 3, FieldName_CR: "Phone", Source_ID: 2, SourceName_CR: "Care Two", }, { Field_ID: 4, FieldName_CR: "Email", Source_ID: 2, SourceName_CR: "Care Two", }, ];
const uniqueItems = [];
body.forEach(({Source_ID, SourceName_CR}) => {
const found = uniqueItems.find(o => o.Source_ID === Source_ID);
if(!found){
uniqueItems.push({Source_ID, SourceName_CR});
}
})
console.log(uniqueItems);
Upvotes: 2
Reputation: 370809
A Set won't work here because you want to deduplicate objects - but objects can't be compared with each other that way. Doing just .map(item => item.SourceName_CR)
doesn't make sense either because then you only get the string (eg Care Two
) and not the whole object you want.
Group the source names by the source IDs to deduplicate, then turn the entries of the resulting object into the required structure.
const body = [
{
Field_ID: 1,
FieldName_CR: "First Name",
Source_ID: 1,
SourceName_CR: "Care One"
},
{
Field_ID: 2,
FieldName_CR: "Last Name",
Source_ID: 1,
SourceName_CR: "Care One"
}, {
Field_ID: 3,
FieldName_CR: "Phone",
Source_ID: 2,
SourceName_CR: "Care Two"
},
{
Field_ID: 4,
FieldName_CR: "Email",
Source_ID: 2,
SourceName_CR: "Care Two"
}, ];
const namesBySourceID = Object.fromEntries(
body.map(obj => [obj.Source_ID, obj.SourceName_CR])
);
const result = Object.entries(namesBySourceID)
.map(([Source_ID, SourceName_CR]) => ({ Source_ID, SourceName_CR }));
console.log(result);
Upvotes: 4