JS中高效分组转换数组为指定JSON格式的最优方案
问题描述
现有一个含动态键的对象数组(输入示例如下),需将其转换为按Key1、Key2分组,以editedDate为键存储对应数据的JSON格式(目标输出示例如下)。数据量可能超过5万条,此前使用多层循环实现存在性能卡顿,尝试arquero SQL也未得到目标结果,寻求高效实现方法。
输入示例
[ { Key1 : "Value 1", Key2 : "Value 2", editedDate : "2024-03-04", editedValue : 10, editedLock : 1 }, { Key1 : "Value 1", Key2 : "Value 2", editedDate : "2024-03-11", editedValue : 10, editedLock : 1 }, { Key1 : "Value 1_1", Key2 : "Value 2_1", editedDate : "2024-03-04", editedValue : 10, editedLock : 1 }, { Key1 : "Value 1_1", Key2 : "Value 2_1", editedDate : "2024-03-11", editedValue : 10, editedLock : 1 } ]
目标输出示例
[ { Key1: "Value 1", Key2: "Value 2", "2024-03-04": { editedValue: 10, editedLock: 1 }, "2024-03-11": { editedValue: 10, editedLock: 1 } }, { Key1: "Value 1_1", Key2: "Value 2_1", "2024-03-04": { editedValue: 10, editedLock: 1 }, "2024-03-11": { editedValue: 10, editedLock: 1 } } ]
高效实现方案
采用单次循环+哈希映射的方式处理,时间复杂度为O(n),是大数据量场景下的最优选择,彻底避免多层循环带来的O(n²)性能损耗。核心逻辑是用Key1和Key2拼接成唯一标识作为哈希表索引,快速定位分组对象并直接更新对应日期的数据。
JavaScript实现代码
function transformData(inputArray) { const groupMap = new Map(); for (const item of inputArray) { // 生成唯一分组键,确保Key1+Key2组合不重复 const uniqueKey = `${item.Key1}_${item.Key2}`; let groupItem = groupMap.get(uniqueKey); if (!groupItem) { // 首次创建分组对象 groupItem = { Key1: item.Key1, Key2: item.Key2 }; groupMap.set(uniqueKey, groupItem); } // 将当前日期的数据挂载到分组对象上 groupItem[item.editedDate] = { editedValue: item.editedValue, editedLock: item.editedLock }; } // 将Map中的分组对象转换为数组输出 return Array.from(groupMap.values()); } // 测试示例 const inputData = [ { Key1: "Value 1", Key2: "Value 2", editedDate: "2024-03-04", editedValue: 10, editedLock: 1 }, { Key1: "Value 1", Key2: "Value 2", editedDate: "2024-03-11", editedValue: 10, editedLock: 1 }, { Key1: "Value 1_1", Key2: "Value 2_1", editedDate: "2024-03-04", editedValue: 10, editedLock: 1 }, { Key1: "Value 1_1", Key2: "Value 2_1", editedDate: "2024-03-11", editedValue: 10, editedLock: 1 } ]; const outputData = transformData(inputData); console.log(JSON.stringify(outputData, null, 2));
方案优势
- 仅遍历一次输入数组,5万条数据可毫秒级处理
- 用
Map实现哈希映射,分组查找操作时间复杂度为O(1) - 逻辑简洁无冗余,内存占用可控,不会出现性能瓶颈
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

