You need to enable JavaScript to run this app. 如何自定义D3.js hierarchy求和逻辑,多字段汇总保留原字段名
优惠活动
大模型
产品
解决方案
定价
更多

如何自定义D3.js hierarchy求和逻辑,多字段汇总保留原字段名

解决方案

你可以使用D3层级结构内置的eachAfter后序遍历方法实现自定义多字段求和,遍历逻辑和内置sum方法完全一致,支持任意数量字段的累加且可以自定义字段名:

步骤1:生成层级结构

先修正你原代码中的小笔误(parentId回调中少了空格):

var data = [{ "Id": 1, "Name": "a1", "Parent": null},
           { "Id": 2, "Name": "a2", "Parent": 1},
           { "Id": 3, "Name": "a3", "Parent": 2, "nb1": 30, "nb2": 40 },
           { "Id": 4, "Name": "a4", "Parent": 2, "nb1": 25, "nb2": 64 },
           { "Id": 5, "Name": "a5", "Parent": 1},
           { "Id": 6, "Name": "a6", "Parent": 5, "nb1": 2, "nb2": 6 },
           { "Id": 7, "Name": "a7", "Parent": 5, "nb1": 5, "nb2": 4 }];

var treeData = d3.stratify()
  .id(function (d) { return d.Id; })
  .parentId(function (d) { return d.Parent; })(data);

步骤2:实现多字段自定义求和

eachAfter会从最底层叶子节点开始向上遍历父节点,处理当前节点时所有子节点的求和已经完成,直接累加即可:

treeData.eachAfter(function(node) {
  // 初始化当前节点字段值,本身有值就用自身值,没有则初始化为0
  let sumNb1 = node.data.nb1 || 0;
  let sumNb2 = node.data.nb2 || 0;

  // 累加所有子节点的对应字段值
  if (node.children) {
    node.children.forEach(child => {
      sumNb1 += child.nb1;
      sumNb2 += child.nb2;
    })
  }

  // 将求和结果挂载到节点上,保留原字段名
  node.nb1 = sumNb1;
  node.nb2 = sumNb2;
  // 如果需要同步更新原始data对象,改为赋值给node.data.nb1、node.data.nb2即可
})

结果验证

执行完成后各节点的求和结果如下,符合预期:

  • 根节点a1(Id=1):nb1=62,nb2=114
  • 二级节点a2(Id=2):nb1=55,nb2=104
  • 二级节点a5(Id=5):nb1=7,nb2=10
  • 叶子节点保留原始数值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 15:06:05