zoukankan      html  css  js  c++  java
  • javascript树形汇总金额(带children属性)

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

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

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

  • 相关阅读:
    poj 3310(并查集判环,图的连通性,树上最长直径路径标记)
    poj 3308(最小点权覆盖、最小割)
    poj 3281(网络流+拆点)
    poj 3275(传递闭包)
    poj 3204(最小割)
    poj 3164(最小树形图)
    poj 2987(最大权闭合图+割边最少)
    poj 2455(二分+最大流)
    poj 2391(二分+最大流)
    poj 2135(最小费用最大流)
  • 原文地址:https://www.cnblogs.com/yanggb/p/11764858.html
Copyright © 2011-2022 走看看