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

如何按相同键将对象数组转换为指定结构的数组或对象?

按相同键合并对象数组的多种实现方式

我拥有一个对象数组,希望按相同键将这些对象合并为单个集合(数组或对象形式均可),同时保留对应datetime与键值组成的子数组。目前已通过forEach()方法实现该需求,但想了解其他可行的实现方式。


当前输入数组

[
  {
    "datetime": "2022-01-10",
    "a": 0.5,
    "b": 80.6,
    "c": 1002.2
  },
  {
    "datetime": "2022-01-11",
    "a": 0.7,
    "b": 80.4,
    "c": 1002.4
  },
  {
    "datetime": "2022-01-12",
    "a": 0.4,
    "b": 80.2,
    "c": 1002.3
  }
]

预期结果

数组形式结果

[
  [
    ["2022-01-10", 0.5], ["2022-01-11", 0.7], ["2022-01-12", 0.4]
  ],
  [
    ["2022-01-10", 80.6], ["2022-01-11", 80.4], ["2022-01-12", 80.2]
  ],
  [
    ["2022-01-10", 1002.2], ["2022-01-11", 1002.4], ["2022-01-12", 1002.3]
  ]
]

对象形式结果

{
  "a": [
    ["2022-01-10", 0.5], ["2022-01-11", 0.7], ["2022-01-12", 0.4]
  ],
  "b": [
    ["2022-01-10", 80.6], ["2022-01-11", 80.4], ["2022-01-12", 80.2]
  ],
  "c": [
    ["2022-01-10", 1002.2], ["2022-01-11", 1002.4], ["2022-01-12", 1002.3]
  ]
}

现有forEach实现

const foo = [[], [], []];
json.forEach((item) => {
  const [a, b, c] = foo;
  a.push([item.datetime, item.a]);
  b.push([item.datetime, item.b]);
  c.push([item.datetime, item.c]);
});

其他实现方式

1. 使用reduce生成对象形式结果(适配动态键)

不需要提前固定键名,自动处理所有非datetime的键:

const resultObj = json.reduce((acc, item) => {
  const datetime = item.datetime;
  Object.keys(item).forEach(key => {
    if (key !== 'datetime') {
      acc[key] = acc[key] || [];
      acc[key].push([datetime, item[key]]);
    }
  });
  return acc;
}, {});

2. 从对象结果转换为数组形式

基于上面的对象结果,直接提取值即可得到数组形式:

const resultArray = Object.values(resultObj);

3. 用reduce直接生成数组形式(固定键场景)

如果确定键为a、b、c,可以直接初始化数组结构:

const resultArray = json.reduce((acc, item) => {
  acc[0].push([item.datetime, item.a]);
  acc[1].push([item.datetime, item.b]);
  acc[2].push([item.datetime, item.c]);
  return acc;
}, [[], [], []]);

4. 结合map与Object.entries实现

先提取目标键,再遍历每个键生成对应数组:

// 获取所有非datetime的键
const keys = Object.keys(json[0]).filter(key => key !== 'datetime');
// 生成对象形式结果
const resultObj = Object.fromEntries(
  keys.map(key => [
    key,
    json.map(item => [item.datetime, item[key]])
  ])
);
// 转数组形式:Object.values(resultObj)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:20:53