繁体   English   中英

如何根据键对 JavaScript 数组 Object 进行分组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM