如何递归聚合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
相关产品推荐
相关产品推荐

