Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript d3层次结构平均子节点值的能力_Javascript_Json_D3.js_Ecmascript 6 - Fatal编程技术网

Javascript d3层次结构平均子节点值的能力

Javascript d3层次结构平均子节点值的能力,javascript,json,d3.js,ecmascript-6,Javascript,Json,D3.js,Ecmascript 6,我有一个d3可视化,它有一个类似于下面的JSON对象,我想平均最低节点上的score值,并动态地将该平均值添加到上面的父节点……以此类推。看起来d3并没有一个简单的方法来做到这一点。我希望最终的JSON输出与第二个示例类似 { "name": "A1", "children": [ { "name": "B1", "children": [ { "name": "B1-C1", "children"

我有一个d3可视化,它有一个类似于下面的JSON对象,我想平均最低节点上的
score
值,并动态地将该平均值添加到上面的父节点……以此类推。看起来d3并没有一个简单的方法来做到这一点。我希望最终的JSON输出与第二个示例类似

 {
  "name": "A1",
  "children": [
    {
      "name": "B1",
      "children": [
        {
          "name": "B1-C1",
          "children": [
            {
              "name": "B1-C1-D1",
              "children": [
                {
                  "name": "B1-C1-D1-E1",
                  "value": 30,
                  "score": 0.8
                },
                {
                  "name": "B1-C1-D1-E2",
                  "value": 35,
                  "score": 0.5
                }
              ]
            },
            {
              "name": "B1-C1-D2",
              "children": [
                {
                  "name": "B1-C1-D2-E1",
                  "value": 31,
                  "score": 0.4
                },
                {
                  "name": "B1-C1-D2-E2",
                  "value": 23,
                  "score": 0.7
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}
我希望最终的JSON对象是什么样子的:

{
  "name": "A1",
  "scoreAvg": 0.625,
  "children": [
    {
      "name": "B1",
      "scoreAvg": 0.625,
      "children": [
        {
          "name": "B1-C1",
          "scoreAvg": 0.625,
          "children": [
            {
              "name": "B1-C1-D1",
              "scoreAvg": 0.7,
              "children": [
                {
                  "name": "B1-C1-D1-E1",
                  "value": 30,
                  "score": 0.8
                },
                {
                  "name": "B1-C1-D1-E2",
                  "value": 35,
                  "score": 0.6
                }
              ]
            },
            {
              "name": "B1-C1-D2",
              "scoreAvg": 0.55,
              "children": [
                {
                  "name": "B1-C1-D2-E1",
                  "value": 31,
                  "score": 0.4
                },
                {
                  "name": "B1-C1-D2-E2",
                  "value": 23,
                  "score": 0.7
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

您可以使用递归函数:

const obj={
“名称”:“A1”,
“儿童”:[{
“名称”:“B1”,
“儿童”:[{
“名称”:“B1-C1”,
“儿童”:[{
“名称”:“B1-C1-D1”,
“儿童”:[{
“名称”:“B1-C1-D1-E1”,
“价值”:30,
“分数”:0.8
},
{
“名称”:“B1-C1-D1-E2”,
“价值”:35,
“分数”:0.5
}
]
},
{
“名称”:“B1-C1-D2”,
“儿童”:[{
“名称”:“B1-C1-D2-E1”,
“价值”:31,
“分数”:0.4
},
{
“名称”:“B1-C1-D2-E2”,
“价值”:23,
“分数”:0.7
}
]
}
]
}]
}]
}
函数getWithAverageScore(objToRecurse){
//如果我有分数,我已经完成了
if(objToRecurse.score){
返回OBJTORE诅咒;
}
//否则,我会让我的孩子知道他们的平均分数
const children=objToRecurse.children.map(getWithAverageScore);
返回{
…对象诅咒,
儿童
//我将我的平均分数设置为他们的平均值(分数或平均分数)
scoreAvg:children.reduce((total,{score,scoreAvg})=>total+(score | | scoreAvg),0)/children.length
};
}
log(JSON.stringify(getWithAverageScore(obj),null,2))
let o = {
  "name": "A1",
  "children": [
    {
      "name": "B1",
      "children": [
        {
          "name": "B1-C1",
          "children": [
            {
              "name": "B1-C1-D1",
              "children": [
                {
                  "name": "B1-C1-D1-E1",
                  "value": 30,
                  "score": 0.8
                },
                {
                  "name": "B1-C1-D1-E2",
                  "value": 35,
                  "score": 0.5
                }
              ]
            },
            {
              "name": "B1-C1-D2",
              "children": [
                {
                  "name": "B1-C1-D2-E1",
                  "value": 31,
                  "score": 0.4
                },
                {
                  "name": "B1-C1-D2-E2",
                  "value": 23,
                  "score": 0.7
                }
              ]
            }
          ]
        }
      ]
    }
  ]
};


function avgUp(object){
  object.avgScore = 0;
if(object.children){
  for(child of object.children){
    object.avgScore += avgUp(child);
   }
object.avgScore =  object.avgScore /Math.max(1,object.children.length);
   return object.avgScore;
}else{
return object.score;
}
}

avgUp(o);

console.log(JSON.stringify(o));