如何将多层对象数组转换为按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 }) );
方案优势
- 性能优异:仅需遍历所有values子项一次,再做一次哈希表转数组操作,无多余嵌套查找
- 兼容性更强:不依赖首个月份包含所有id,即使部分月份缺少某id的统计数据也可正常运行
- 顺序有保障:完全按原数组的月份先后顺序追加value,无需额外排序操作
内容的提问来源于stack exchange,提问作者Chandrika
相关产品推荐
相关产品推荐

