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

使用reduce递归实现JSON对象的多层级分组问题

递归实现JSON数组的多层级分组转换

需求说明

现有一组JSON对象数组,需要按指定字段的层级顺序(示例为AREA → SUPER_REGION → STATE,实际场景层级更多)转换为嵌套的多层级结构。目前仅用reduce完成了第一级(AREA)的分组,需要实现递归逻辑处理所有层级。

示例数据

[
  {"AREA": "EMEA","SUPER_REGION": "West Mediterranean Region","STATE": "Portugal"},
  {"AREA": "USAC","SUPER_REGION": "United States","STATE": "california"},
  {"AREA": "USAC","SUPER_REGION": "United States","STATE": "Texas"},
  {"AREA": "ASIA","SUPER_REGION": "Japan","STATE": "Japan"},
  {"AREA": "EMEA","SUPER_REGION": "North Europe Region","STATE": "ECOE"},
  {"AREA": "USAC","SUPER_REGION": "United States","STATE": "Georgia"}
]

预期结果

[
  {"EMEA": {"West Mediterranean Region": {"Portugal": null},"North Europe Region": {"ECOE": null}}},
  {"USAC": {"United States": {"Georgia": null, "Texas": null, "california": null}}},
  {"ASIA": {"Japan": {"Japan": null}}}
]

注:原预期结果中同一United States下重复出现相同键,这不符合JSON对象规范(重复键会被覆盖),上述是修正后的合法结构。

已尝试代码

const result = data.reduce((grouped_Data, hierarchy) => {
  const region = hierarchy["AREA"];
  if (grouped_Data[region] == null) grouped_Data[region] = [];
  grouped_Data[region].push(hierarchy);
  return grouped_Data;
}, {});

解决方案

通过递归函数结合reduce可实现任意层级的嵌套分组,核心思路是按指定层级顺序逐层构建嵌套结构:

实现代码

// 定义层级顺序,可根据实际需求调整字段和顺序
const levelOrder = ['AREA', 'SUPER_REGION', 'STATE'];

function buildHierarchy(data, levels) {
  // 递归终止条件:层级为空时返回叶子节点值null
  if (levels.length === 0) return null;

  return data.reduce((acc, item) => {
    const currentKey = levels[0];
    const currentValue = item[currentKey];
    // 递归处理剩余层级,生成子结构
    const childStructure = buildHierarchy([item], levels.slice(1));

    // 检查当前层级值是否已存在于结果中
    const existingItem = acc.find(entry => entry.hasOwnProperty(currentValue));
    if (existingItem) {
      // 合并子结构,避免重复父节点
      Object.assign(existingItem[currentValue], childStructure);
    } else {
      // 不存在则新增条目
      acc.push({ [currentValue]: childStructure });
    }

    return acc;
  }, []);
}

// 使用示例
const data = [/* 你的示例数据 */];
const finalResult = buildHierarchy(data, levelOrder);
console.log(JSON.stringify(finalResult, null, 2));

代码说明

  1. levelOrder数组定义分组的层级优先级,可根据业务需求灵活调整字段;
  2. 递归函数buildHierarchy:
    • 当层级数组为空时返回null,作为叶子节点的终止值;
    • 用reduce遍历数据,按当前层级的键值进行分组;
    • 递归调用自身处理剩余层级,生成嵌套的子结构;
    • 自动合并同一父节点下的子结构,保证JSON结构的合法性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:25:29