js如何处理树形数据如何从最末级向上递归,计算每个节点的children中的某个字段的值的合计

新手上路,请多包涵

需求是一个树表,每个节点都有field1field2field3idpid这几个字段,field3field1xfield2得到,父节点的field3由每个子节点的field3相加得到,如果我修改其中某个子节点field1field2就从此节点往上计算所有父节点的field3

节点 field1 field2 field3
1 - - 6
1-1 2 2 4
1-2 2 1 2
2 - - 20
2-1 4 4 16
2-2 - - 4
2-2-1 2 2 4

数据格式为普通树,子节点在节点的children字段中

阅读 6.3k
2 个回答
let seed = 1;

const dftOptions = {
  field1: 0,
  field2: 0
};

type ItemOpt = {
  field1: number;
  field2: number;
};
class Item {
  field1: number;
  field2: number;
  children: Item[] = [];
  id: number;
  pid: number = 0;
  constructor(opt: ItemOpt) {
    opt = { ...dftOptions, ...opt };
    this.id = seed++;
    this.field1 = opt.field1;
    this.field2 = opt.field2;
  }

  get field3(): number {
    if (!this.children.length) return this.field1 + this.field2;
    return this.children.reduce((r: number, it) => r + it.field3, 0);
  }

  push(item: Item) {
    item.pid = this.id;
    this.children.push(item);
  }
}
function calField (tree) {
  tree.forEach(node => {
    if (node.chidldren && node.chidldren.length) {
        calField(node.children)
        node.field3 = node.children.reduce((sum, item) => (sum += item.filed3, sum), 0)
    } else {
      node.field3 = node.field1 * node.field2
    }
  })
  return tree
}

随手写了一个,没测试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题