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

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);

为什么这是最高效的?

  1. 时间复杂度O(n):只遍历from数组一次,Map的查找、Set的添加都是O(1)操作,整体性能最优。
  2. 自动去重:用Set存储SUBNUM,遍历过程中直接跳过重复值,不需要额外的去重步骤。
  3. 内存高效:中间缓存只存储必要的分组信息,不会冗余存储重复数据。

如果你的to结构中submenu的子项需要更多自定义字段(比如关联完整的NUM值),只需要调整Set存储的内容(比如存储包含NUM和SUBNUM的对象,同时用字符串化的键来判断重复),但核心思路还是一次遍历完成所有操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:10:56