在开发企业应用的时候总会遇到树形汇总金额的场景,即将树形的列表中的叶子节点(没有子节点)的金额汇总到父节点上。
这种需求一般是在前端进行处理,即使用JavaScript处理,因为叶子节点的金额可能是不断改变的,每回变动都请求后台显然不现实。
场景与实现
假设有一个主从表的场景。第一点,从表是一个树形的列表,只有叶子节点能填写金额,父节点都汇总其下叶子节点的金额。第二点,主表有一个金额字段,取值汇总自汇总从表中所有根节点(顶级父节点)的金额。
先编写一个遍历从表中所有根节点的方法。
function sumMoney2Main(items) { let sumMoney = 0; for (let item of items) { this.sumMoneyToItsParent(item); sumMoney += item.money || 0; } return sumMoney; }
然后编写一个递归汇总子节点金额的方法。
function sumMoneyToItsParent(item) { let sumMoney = 0; if (item.children && item.children.length) { for (let childItem of item.children) { sumMoneyToItsParent(childItem); sumMoney += childItem.money || 0; } item.money = sumMoney; } }
这样就完成了树形汇总金额的需求。
简单分析
这里主要有几个要点。
1.在JavaScript中,数组中的对象都是保存在堆内存中的,栈内存中的变量只是保存的对这些对象的引用,因此在上面的代码中,无论将数组中的对象的引用赋予给多少个变量并做改动,实际上都是对数组中对象的改动,这是最基础的。这一特性被称为浅拷贝。
2.递归的要点是在遍历子节点的时候,先去遍历子节点的子节点,直到没有子节点了,才开始一级一级累加金额。
"他们都在看烟花,无人想起你。"
原文地址:https://www.cnblogs.com/yanggb/p/11764858.html
时间: 2024-11-13 01:22:52