您的位置:首页 > Web前端 > JavaScript

javascript树形汇总金额

2019-12-14 06:28 120 查看

在开发企业应用的时候总会遇到树形汇总金额的场景,即将树形的列表中的叶子节点(没有子节点)的金额汇总到父节点上。

这种需求一般是在前端进行处理,即使用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.递归的要点是在遍历子节点的时候,先去遍历子节点的子节点,直到没有子节点了,才开始一级一级累加金额。

 

"他们都在看烟花,无人想起你。"

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: