使用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));
代码说明
levelOrder数组定义分组的层级优先级,可根据业务需求灵活调整字段;- 递归函数
buildHierarchy:- 当层级数组为空时返回
null,作为叶子节点的终止值; - 用
reduce遍历数据,按当前层级的键值进行分组; - 递归调用自身处理剩余层级,生成嵌套的子结构;
- 自动合并同一父节点下的子结构,保证JSON结构的合法性。
- 当层级数组为空时返回
内容的提问来源于stack exchange,提问作者Divakar R
相关产品推荐
相关产品推荐

