JavaScript中JSON重构:将from转to的高效方法及是否需先去重问询
高效实现JSON数组的层级转换与去重
嘿,这个转换需求我太熟悉了!要实现从from到to的结构转换,最高效的方式是一次遍历完成分组、去重和结构重组,完全不需要单独先做去重步骤——单独去重会多一次遍历,反而拖慢性能。
先明确目标结构细节
从你给出的to示例来看,最终结构应该是:
- 顶级是一个数组,包含一个对象,
label为'SUBNUM' - 它的
submenu是按NUM的前4位(比如1234、4567)分组的对象集合,每个分组对象有label、role(值都是前4位),还有自己的submenu,里面是去重后的SUBNUM对应的选项(比如001、002)
实现代码(一次遍历完成所有操作)
const from = [ { NUM: '1234001', SUBNUM: '001'}, { NUM: '1234001', SUBNUM: '001'}, { NUM: '1234002', SUBNUM: '002'}, { NUM: '1234005', SUBNUM: '005'}, { NUM: '4567001', SUBNUM: '001'}, { NUM: '9999001', SUBNUM: '001'} ]; // 用Map做中间缓存,键是NUM前4位,值是分组对象(含去重的SUBNUM集合) const groupMap = new Map(); for (const item of from) { // 提取NUM的前4位作为分组键 const prefix = item.NUM.slice(0, 4); const subNum = item.SUBNUM; // 如果分组不存在,初始化分组对象,用Set存SUBNUM自动去重 if (!groupMap.has(prefix)) { groupMap.set(prefix, { label: prefix, role: prefix, submenu: new Set() }); } // 将当前SUBNUM加入分组的Set(自动忽略重复项) groupMap.get(prefix).submenu.add(subNum); } // 将Map转换为目标结构:把Set转为对象数组,再组装顶级结构 const to = [ { label: 'SUBNUM', submenu: Array.from(groupMap.values()).map(group => ({ ...group, // 把Set转成{ label: SUBNUM, role: SUBNUM }的对象数组 submenu: Array.from(group.submenu).map(num => ({ label: num, role: num // 如果需要更多字段,比如关联完整NUM,可以在这里补充 })) })) } ]; console.log(to);
为什么这是最高效的?
- 时间复杂度O(n):只遍历
from数组一次,Map的查找、Set的添加都是O(1)操作,整体性能最优。 - 自动去重:用Set存储SUBNUM,遍历过程中直接跳过重复值,不需要额外的去重步骤。
- 内存高效:中间缓存只存储必要的分组信息,不会冗余存储重复数据。
如果你的to结构中submenu的子项需要更多自定义字段(比如关联完整的NUM值),只需要调整Set存储的内容(比如存储包含NUM和SUBNUM的对象,同时用字符串化的键来判断重复),但核心思路还是一次遍历完成所有操作。
内容的提问来源于stack exchange,提问作者user5072412
相关产品推荐
相关产品推荐

