I want to duplicate entire objects inside an array, based on the properties inside the object. I need to duplicate the objects, based on the split emails, in nominations.
For example
array = [
{
id:1,
name: ravi,
nominations: xyz@gmail.com, abc@gmail.com
},
{
id:2
name: ramu,
nominations: 123@gmail.com, 456@gmail.com
}
]
Need Output like
Output_array = [
{
id:1,
name: ravi,
nominations: xyz@gmail.com
},
{
id:1,
name: ravi,
nominations: abc@gmail.com
},
{
id:2
name: ramu,
nominations: 123@gmail.com
},
{
id:2
name: ramu,
nominations: 456@gmail.com
}
]
The easiest way would be to flatMap over the items, then map over the nominations.
const data = [{
id:1,
name: "ravi",
nominations: "xyz@gmail.com, abc@gmail.com"
},
{
id:2,
name: "ramu",
nominations: "123@gmail.com, 456@gmail.com"
}];
const result = data.flatMap(item => {
return item.nominations.split(", ").map(email => ({
id: item.id,
name: item.name,
nomination: email
}))
})
console.log(result)
A pretty straightforward way using loops:
let data = [
{
"id": 1,
"name": "ravi",
"nominations": "xyz@gmail.com,abc@gmail.com"
},
{
"id": 2,
"name": "ramu",
"nominations": "123@gmail.com,456@gmail.com"
}
];
let newData = []
for (let element of data) {
let emailIds = element.nominations.split(",");
if (emailIds.length > 1) {
for (let emailId of emailIds)
newData.push({ id: element.id, name: element.name, nominations: emailId })
}
}
console.log(newData)
Explanation: Starting with traversing the entire objects, in each object you split the nominations string and split it with "," to check if there is more than one email. If it does exist, you run a loop to individually add them.
This could be done with an arguably long one-liner. Object.assign function can be employed to duplicate input object while changing property/properties of interest.
let input = [{
id: 1,
name: `ravi`,
nominations: `xyz@gmail.com, abc@gmail.com`
},
{
id: 2,
name: `ramu`,
nominations: `123@gmail.com, 456@gmail.com`
}];
let output = input.flatMap(i => i.nominations.split(",").map(n => Object.assign({}, i, { nominations: n.trim() })));
console.log(output);