【问题标题】:How can I merge an array and group by key in Javascript?如何在 Javascript 中按键合并数组和分组?
【发布时间】:2021-12-03 16:39:20
【问题描述】:

我在 reactjs 中有多个数组。

{last_name: 'User1', status: 'BRONZE', type: 'Maintenance', due_date: '2022-06-04 00:00:00'}
{last_name: 'User1', status: 'BRONZE', type: 'Contrôle technique', due_date: '2022-06-18 00:00:00'}
{last_name: 'User2', status: 'BRONZE', type: 'Unknow', due_date: null}

我想按用户姓氏合并数组以获得如下结果:

{last_name: 'User1', status1: 'BRONZE', type: 'Maintenance1', due_date1: '2022-06-04 00:00:00', status2: 'BRONZE', type2: 'Contrôle technique', due_date: '2022-06-18 00:00:00'}
{last_name: 'User2', status: 'BRONZE', type: 'Unknow', due_date: null}

在我的示例中,我将数组 1 和 2 合并为 1 个数组“分组依据”last_name,此处为 User1,但我也需要保留第二个数组的值。

【问题讨论】:

  • 这与 React 或 Redux 没有任何特别的关系,只是 JavaScript。我建议您从问题中删除这些标签并编辑标题。
  • state1state2... 这是糟糕的设计。不要那样做。如果您需要对具有相同含义的多个值进行分组,请使用 state 数组。 due_date1...

标签: javascript arrays merge


【解决方案1】:

您的问题缺少一些细节。 statusdue_date 是唯一可能重复的字段吗?如果是这样,下面的答案应该有效。如果没有,您可能需要指定哪些键应该与字段名称中的索引合并,哪些可以按原样拉入。

我不知道您为什么要以这种方式构建数据 - 使用不同的字段名称似乎会使查找数据变得困难,但将其放在一边:

const data = [{
  last_name: 'User1',
  status: 'BRONZE',
  type: 'Maintenance',
  due_date: '2022-06-04 00:00:00'
}, {
  last_name: 'User1',
  status: 'BRONZE',
  type: 'Contrôle technique',
  due_date: '2022-06-18 00:00:00'
}, {
  last_name: 'User2',
  status: 'BRONZE',
  type: 'Unknow',
  due_date: null
}]

const mergedMap = {}

// Group list elements by last_name
for (const el of data) {
  if (el.last_name in mergedMap) {
    mergedMap[el.last_name].push(el)
  } else {
    mergedMap[el.last_name] = [el]
  }
}

// Iterate over "user" groups, modifying field names.
const mergedList = []
for (const last_name in mergedMap) {
  const elCount = mergedMap[last_name].length
  // If there's only one entry for this "last_name", keep it as is, 
  // then continue to next user.
  if (elCount === 1){
    mergedList.push(mergedMap[last_name][0])
    continue
  }
  const mergedUser = mergedMap[last_name].reduce((merged, el, index) => ({
    // Keep whatever keys are already here
    ...merged,
    // last_name and status are assumed to always be the same
    // for a given user, so they're safe to overwrite each time
    last_name: el.last_name,
    status: el.status,
    // type and due_date might be unique for each entry, so
    // we add an index to the field name and copy the new value in
    [`type${index + 1}`]: el.type,
    [`due_date${index + 1}`]: el.due_date,
  }), {})
  mergedList.push(mergedUser)
}

console.log(JSON.stringify(mergedList, null, 2))

【讨论】:

  • 非常感谢您的回答。我想像这样构造我的数据,因为我使用导出 excel,我需要像这样构造导出 XLS 文件。我没有其他解决方案可以做到这一点。如果您有更好的解决方案,我想知道:)
猜你喜欢
  • 2017-02-25
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多