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

如何将多层对象数组转换为按id分组、取值按时间排序的简化数组

实现思路

利用哈希表(Map/普通对象)做中间缓存,仅需两次遍历即可完成转换,时间复杂度为O(N)(N为所有values子项的总数量),性能远高于三层循环的实现。同时因为原输入数组本身已经按月份先后顺序排列,遍历过程中直接按顺序追加value即可保证分组后的values顺序符合要求。

代码实现

可读性优先版本

// 初始化哈希表存储每个id对应的value序列
const idValueMap = new Map();

// 遍历所有月份数据
for (const monthData of arr1) {
  // 遍历当月所有指标值
  for (const { id, value } of monthData.values) {
    // 不存在该id时初始化空数组
    if (!idValueMap.has(id)) {
      idValueMap.set(id, []);
    }
    // 按月份顺序追加value
    idValueMap.get(id).push(value);
  }
}

// 将哈希表转换为目标数组结构
const arr2 = Array.from(idValueMap, ([id, values]) => ({ id, values }));

精简写法(reduce实现)

const arr2 = Array.from(
  arr1.reduce((map, { values }) => {
    values.forEach(({ id, value }) => 
      map.has(id) ? map.get(id).push(value) : map.set(id, [value])
    );
    return map;
  }, new Map()),
  ([id, values]) => ({ id, values })
);

方案优势

  1. 性能优异:仅需遍历所有values子项一次,再做一次哈希表转数组操作,无多余嵌套查找
  2. 兼容性更强:不依赖首个月份包含所有id,即使部分月份缺少某id的统计数据也可正常运行
  3. 顺序有保障:完全按原数组的月份先后顺序追加value,无需额外排序操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:57:01