函数从子对象计算父对象大小's大小

function to calculate the parent size from children's size

本文关键字:对象 大小 计算 函数      更新时间:2023-09-26

我正在做这样的事情,http://bl.ocks.org/mbostock/1283663但我希望父母的体型是孩子的平均体型。我找到了一个解决方案,但它只适用于最后一位家长。我的建议是实现一个新的函数平均

                   function average(d) {
if (d.children !=null){
return d3.sum(d.children, function(d) {return d.value;})/d.children.length;}
                else{
            return d.value;
                }
                  }

然后我替换所有出现的

        .attr("width", function(d) { return x(d.value); })

带有

             .attr("width", function(d) { return x(average(d)); }) 

但它只计算最晚的父母和他们的孩子的平均值。你知道我如何纠正这个函数来计算所有父母的平均值吗?这是我第三次问这个问题,但请理解我,这对我来说很有趣,我知道如果有人帮助我,我会找到解决方案非常感谢

首先,您不需要发明一个新函数来为对象数组中的每个元素找到某个属性的平均值。您可以使用d3.mean

您可以使用递归函数为每个具有子节点的节点添加一个新属性,将其称为averageChildValue

例如,您可以这样做:

function recurse(node) {
  // IF A NODE HAS CHILDREN...
  if (node.children) {
    // ADD A PROPERTY REPRESENTING THE AVG VALUE OF ITS CHILDREN
    node.averageChildValue = d3.mean(node.children, function(d) { 
      return d.value;
    });
    // RECURSIVELY CALL THE FUNCTION ON THE CHILDREN
    node.children.forEach(function(d) { recurse(d); });
  }
}
d3.json("readme.json", function(error, root) {
  // PARTITION THE DATA
  partition.nodes(root);
  // USE THE RECURSIVE FUNCTION TO CALCULATE THE AVERAGES
  recurse(root)
  // DO SOMETHING WITH YOUR NEW-AND-IMPROVED DATA
  console.log(root)
});

检查控制台输出,每个具有子节点的节点现在都应该有一个名为averageChildValue的额外属性。