javascript - How to merge the contents of a nested array of objects?
问题描述
I have an array of objects called allLeads
which stores a leadName
and leadId
for each item in the array along with an item called leads which is another array of objects.
But currently how I am receiving data from my backend is that the leads array only stores one object at a time. I want to merge this leads array for each leadId
and leadName
.
How it is currently
const allLeads = [
{
leadName: "software development",
leadId: 123,
leads: [{ profile: "hello", url: "bye" }]
},
{
leadName: "software development",
leadId: 123,
leads: [{ profile: "lets", url: "go" }]
},
{
leadName: "business development",
leadId: 234,
leads: [{ profile: "dont", url: "try" }]
},
{
leadName: "business development",
leadId: 234,
leads: [{ profile: "other", url: "side" }]
}
];
How I want it to be
const allLeads = [
{
leadName: "software development",
leadId: 123,
leads: [{ profile: "hello", url: "bye" }, { profile: "lets", url: "go" }]
},
{
leadName: "business development",
leadId: 234,
leads: [{ profile: "dont", url: "try" }, { profile: "other", url: "side" }]
}
];
解决方案
const allLeads = [
{
leadName: "software development",
leadId: 123,
leads: [{ profile: "hello", url: "bye" }]
},
{
leadName: "software development",
leadId: 123,
leads: [{ profile: "lets", url: "go" }]
},
{
leadName: "business development",
leadId: 234,
leads: [{ profile: "dont", url: "try" }]
},
{
leadName: "business development",
leadId: 234,
leads: [{ profile: "other", url: "side" }]
}
];
function handle(array) {
let obj = array.reduce((acc, cur) => {
acc[cur.leadId] = acc[cur.leadId] || {};
acc[cur.leadId].leads = acc[cur.leadId].leads || [];
acc[cur.leadId].leadName = cur.leadName;
acc[cur.leadId].leadId = cur.leadId;
acc[cur.leadId].leads.push(...cur.leads);
return acc;
}, {});
return Object.values(obj);
}
console.log(handle(allLeads))