亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

d3 層次結構平均子節點值的能力

d3 層次結構平均子節點值的能力

呼喚遠方 2021-10-21 14:15:39
我有一個 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                },               
查看完整描述

2 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

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));


查看完整回答
反對 回復 2021-10-21
?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

您可以使用遞歸函數:


const obj = {

  "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 getWithAverageScore(objToRecurse) {

  // If I have a score I am already done

        if (objToRecurse.score) {

                return objToRecurse;

        }

  // Otherwise, I get my children with their average score

        const children = objToRecurse.children.map(getWithAverageScore);


        return {

                ...objToRecurse,

                children,

    // And I set my scoreAvg to their average (score or scoreAvg)

                scoreAvg: children.reduce((total, { score, scoreAvg }) => total + (score || scoreAvg), 0) / children.length

        };

}


console.log(JSON.stringify(getWithAverageScore(obj), null, 2))



查看完整回答
反對 回復 2021-10-21
  • 2 回答
  • 0 關注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號