Javascript d3层次结构平均子节点值的能力
我有一个d3可视化,它有一个类似于下面的JSON对象,我想平均最低节点上的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"
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));