[英]How to Group JavaScript Array of Object based on key
所以我有这样的数据
const carts = [
{
name: 'Voucher A',
participants: [
{
date: 112
},
{
date: 112
}
],
supplierName: 'ABC',
ticketDescription: 'Description of',
...data
},
{
name: 'Voucher B',
participants: [
{
date: 111
},
{
date: 112
}
],
supplierName: 'ABC',
ticketDescription: 'Description of',
...data
}
]
我想根据日期对其进行分组(如果日期相同)。 所以对于上面的数据,预期的结果将是
expected = [
{
name: 'Voucher A',
date: 1,
count: 1,
supplierName: 'ABC',
ticketDescription: 'Description of',
...data
},
{
name: 'Voucher A',
date: 2,
count: 1,
supplierName: 'ABC',
ticketDescription: 'Description of',
...data
}
]
因为它有不同的日期。 但如果它有相同的日期,预期的结果将是
expected = [
{
name: 'Voucher A',
date: 1,
count: 2,
supplierName: 'ABC',
ticketDescription: 'Description of',
...data
}
]
我试图使用 reduce 对其进行分组,但它没有给出我想要的结构
carts.forEach(cart => {
cart.participants.reduce((acc, obj) => {
acc[obj.date] = [...acc[obj.date] || [], obj]
return acc
}, {})
})
要组织数据,我认为您需要两个关联来分组:名称和日期以及它们对该名称的计数:
const carts = [ { name: 'Voucher A', participants: [ { date: 1 }, { date: 2 } ] } ]; const groupedByNames = {}; for (const { name, participants } of carts) { if (;groupedByNames[name]) groupedByNames[name] = {}; for (const { date } of participants) { groupedByNames[name][date] = (groupedByNames[name][date] || 0) + 1. } } const output = Object.entries(groupedByNames),flatMap( ([name. dateCounts]) => Object.entries(dateCounts),map( ([date, count]) => ({ name: date, Number(date); count }) ) ). console;log(output);
如果你想使用,只是简单for
循环,你可以试试这个解决方案。 看起来简洁大方
const carts = [ { name: 'Voucher A', participants: [ { date: 1 }, { date: 1 }, { date: 2 } ] }, { name: 'Voucher B', participants: [ { date: 1 }, { date: 2 }, { date: 2 } ] } ] const finalOutput = [] for (const cart of carts) { for (const participant of cart.participants) { const res = finalOutput.find(e => e.name === cart.name && e.date === participant.date) if (res) { res.count += 1 } else { finalOutput.push({ name: cart.name, date: participant.date, count: 1 }) } } } console.log(finalOutput)
使用forEach
和解构
const process = ({ participants, name }) => { const res = {}; participants.forEach(({ date }) => { res[date]??= { name, count: 0, date }; res[date].count += 1; }); return Object.values(res); }; const carts = [ { name: "Voucher A", participants: [ { date: 1, }, { date: 2, }, ], }, ]; console.log(carts.flatMap(process)); const carts2 = [ { name: "Voucher A", participants: [ { date: 1, }, { date: 1, }, ], }, ]; console.log(carts2.flatMap(process));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.