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

如何递归聚合JSON结构中子节点count值至各级父节点直至顶层

实现思路
  • 采用后序递归遍历的逻辑:先计算所有子节点的聚合count值,再计算当前节点的总count,确保父节点可以拿到所有子节点的计算结果
  • 每个节点的总count计算规则:当前节点自身原有count值(如果存在) + 所有子节点的聚合count值总和
  • 计算完成后将总count赋值给当前节点的count属性,再返回给上层父节点用于累加
代码实现

Python 版本

import json

def aggregate_count(node):
    # 初始化总和:当前节点自带count则取该值,否则默认0
    total = node.get('count', 0)
    for key, value in node.items():
        # 跳过count属性,避免重复计算自身值
        if key == 'count':
            continue
        # 子节点为字典类型时递归计算其聚合值
        if isinstance(value, dict):
            total += aggregate_count(value)
    # 给当前节点赋值聚合后的count
    node['count'] = total
    return total

# 测试
if __name__ == '__main__':
    input_data = {
        "main": {
            "sub1": {
                "cat": {
                    "subcat1": {"count": 1},
                    "subcat2": {"count": 2}
                }
            },
            "sub2": {
                "cat": {
                    "subcat1": {"count": 3},
                    "subcat2": {"count": 5}
                }
            }
        }
    }
    aggregate_count(input_data['main'])
    print(json.dumps(input_data, indent=2, ensure_ascii=False))

JavaScript 版本

function aggregateCount(node) {
    // 初始化总和
    let total = node.count || 0
    for (const key in node) {
        if (key === 'count') continue
        const value = node[key]
        if (typeof value === 'object' && value !== null) {
            total += aggregateCount(value)
        }
    }
    node.count = total
    return total
}

// 测试
const inputData = {
    "main": {
        "sub1": {
            "cat": {
                "subcat1": {"count": 1},
                "subcat2": {"count": 2}
            }
        },
        "sub2": {
            "cat": {
                "subcat1": {"count": 3},
                "subcat2": {"count": 5}
            }
        }
    }
}
aggregateCount(inputData.main)
console.log(JSON.stringify(inputData, null, 2))
注意事项
  • 遍历节点属性时必须跳过count字段,否则会将自身count作为子节点重复累加,导致数值错误
  • 叶子节点原生自带的count值会被保留,不会被覆盖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:06:02