диаграмма sankey с plotly.js из преобразования объекта, необходимого - PullRequest
0 голосов
/ 27 мая 2018

поэтому у меня есть объект, который мне нужно преобразовать во что-то видимое на диаграмме Санки .объект выглядит так:

"DecisionTreeRegressionModel": [
{
  "  If (feature 28 <= 16.0)": [
    {
       "   If (feature 0 in {0.0})": [
         {
            "    Predict: 13.0": []
         }
       ]
    },
    {
      "   Else (feature 0 not in {0.0})": [
        {
          "    Predict: 16.0": []
        }
      ]
    }
  ]
},
{
  "  Else (feature 28 > 16.0)": [
    {
       "   If (feature 28 <= 40.0)": [
         {
           "    Predict: 40.0": []
         }
       ]
     },
     {
       "   Else (feature 28 > 40.0)": [
         {
           "    If (feature 0 in {0.0})": [
             {
                "     Predict: 45.0": []
             }
           ]
         },
         {
           "    Else (feature 0 not in {0.0})": [
             {
               "     Predict: 50.0": []
             }
           ]
         }
       ]
     }
   ]
 }
]

проблема в том, что я не знаю глубину массива объекта, поэтому он должен генерироваться автоматически.Каков наилучший способ перебрать массив объектов и заполнить набор данных диаграммы Санки?

1 Ответ

0 голосов
/ 30 мая 2018

Я нашел ответ, создав 2 рекурсивных метода, один для меток и один для значений.набор данных значений все еще нуждается в работе, но диаграммы теперь отображаются правильно.

build_labels(node : Node){
   let key : String = node.name;
   let already_added : boolean = false;
   if(this.labels_array.indexOf(key) > -1){
     already_added = true;
   }
   if(!already_added){
     this.labels_array.push(key);
   }

   if(node.children!=null && node.children.length>0){
     for(let i : number = 0 ; i < node.children.length ; i++){
       this.build_labels(node.children[i]);
     }
   }

}


build_chart(node : Node){

   let key : String = node.name;
   let father_index : number = this.labels_array.indexOf(key);

   if(node.children!=null && node.children.length>0){
     for(let i : number = 0 ; i < node.children.length ; i++){
       let child_key : String = node.children[i].name;
       let child_index : number = this.labels_array.indexOf(child_key);
       this.source_array.push(father_index);
       this.target_array.push(child_index);
       this.value_array.push(1);
       this.build_chart(node.children[i]);
     }
   }

}
...