You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript如何基于多键将一维数组拆分为指定格式的二维数组

问题描述

我有如下所示的一维数组,数组内单个对象的结构如下:

[
  {
    date: "01/01/2020",
    type1: 264,
    type2: 1937,
    type3: 30
  },
  ...
]

我需要将上述数组转换为如下格式的二维数组:

[
  [
    {
      "date": "01/01/2020",
      "type": "type1",
      "value": 264
    },
    {
      "date": "01/01/2020",
      "type": "type2",
      "value": 1937
    }
    .....
  ],
  [
    {
      "date": "01/01/2020",
      "type": "type3",
      "value": 30
    }
    .....
  ]
]

具体规则为第一个子数组存放type1、type2对应的条目,第二个子数组存放type3对应的条目。
我是JavaScript新手,目前使用原生JavaScript的实现代码如下:

const type1 = data.map((e: any) => ({
  date: e.date,
  type: "type1",
  value: e.type1
}));

const type2 = data.map((e: any) => ({
  date: e.date,
  type: "type2",
  value: e.type2
}));

const type3 = data.map((e: any) => ({
  date: e.date,
  type: "type3",
  value: e.type3
}));

const newData = [type1.concat(type2), type3];

请问是否有更优的实现方式?

回答

你的现有实现逻辑正确,可读性也很好,唯一的不足是对原数组总共进行了3次遍历,当数据量级较大时会有不必要的性能开销。可以优化为只遍历一次原数组完成全部转换,性能更好:

const result = [[], []]
for (const item of data) {
  // 向第一个子数组插入type1、type2的条目
  result[0].push(
    { date: item.date, type: 'type1', value: item.type1 },
    { date: item.date, type: 'type2', value: item.type2 }
  )
  // 向第二个子数组插入type3的条目
  result[1].push({ date: item.date, type: 'type3', value: item.type3 })
}

如果后续可能调整分组规则,比如新增类型、调整类型所属分组,可以提前定义分组配置,扩展性更强:

// 配置分组规则:数组下标对应结果子数组的位置,元素为该分组包含的类型字段
const groupConfig = [['type1', 'type2'], ['type3']]
const result = groupConfig.map(() => [])

for (const item of data) {
  groupConfig.forEach((typeList, groupIndex) => {
    typeList.forEach(type => {
      result[groupIndex].push({
        date: item.date,
        type,
        value: item[type]
      })
    })
  })
}

这个写法不需要修改遍历逻辑,只需要调整groupConfig就能适配新的分组规则。

内容的提问来源于stack exchange,提问作者lazyCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:39:01