2016-10-31 2 views
-2

У меня есть JSON, представляющий древовидную диаграмму и хочу преобразовать это в JSON с новой структурой, которую можно визуализировать с помощью treant.js.Преобразование JSON в новый JSON с другой структурой

Он должен работать с различным количеством узлов. У каждого узла/детей может быть 0 или 2 детей. На самом деле это моя основная проблема, как перебирать входной JSON для получения всех детей и дочерних элементов без петли для каждого дочернего элемента.

Также заголовок родительского узла представлен только в его дочерних элементах, но мне он нужен в самом родителе.

вход:

treeModel = { 
"TreeModel": { 
    "AlgorithmName": "CART", 
    "Child": [{ 
     "RecordCount": 47, 
     "Score": "1", //should be the name 
     "ScoreDistribution": [ 
      [24, 23], //should be the description as string 
      [0.5106382978723404, 0.4893617021276596] 
     ], 
     "TreeNodePredicate": { 
      "FieldPredID": 0, 
      "FieldPredName": "Attribute1", //should be the title from parent 
      "FieldValue": 0, 
      "Operator": "EQUAL", 
      "PredicateType": "SimplePredicate" 
     } 
    }, { 
     "RecordCount": 214, 
     "Score": "0", //should be the name 
     "ScoreDistribution": [ 
      [2, 212], //should be the description as string 
      [0.009345794392523364, 0.9906542056074767] 
     ], 
     "TreeNodePredicate": { 
      "FieldPredID": 0, 
      "FieldPredName": "Attribute1", //should be the title from parent 
      "FieldValue": 1, 
      "Operator": "EQUAL", 
      "PredicateType": "SimplePredicate" 
     } 
    }], 
    "RecordCount": 261, 
    "Score": "0", //should be the name 
    "ScoreDistribution": [ 
     [26, 235], //should be the description as string 
     [0.09961685823754787, 0.9003831417624522] 
    ], 
    "TreeNodePredicate": { 
     "PredicateType": "TruePredicate" 
    } 
} 
} 

выход:

chart_config = { 
chart: { 
    container: "#tree-simple" 
}, 

nodeStructure: { 
    text: { 
     name: "0" , //Score 
     title: "Attribute1", //FieldPredName from Child 
     desc: "26, 235", //ScoreDistribution as String 
    }, 
    children: [ 
     { 
      text: { 
       name: "1" , //Score 
       title: "", //FieldPredName from Child(empty as no childs) 
       desc: "24, 23", //ScoreDistribution as String 
      } 
     }, 
     { 
      text: { 
       name: "0" , //Score 
       title: "", //FieldPredName from Child(empty as no childs 
       desc: "2, 212", //ScoreDistribution as String 
      } 
     } 
    ] 
} 
}; 
+0

Это не код, написание службы, попробуйте решить вашу проблему самостоятельно, вернуться, когда вы застряли. – GingerPlusPlus

+0

Передайте его конструктору, который переназначает значения. Легко. – Crowes

ответ

0

Вы можете использовать рекурсивный и итеративный подход для преобразования.

function convert(source) { 
 
    var target = { 
 
      text: { 
 
       name: source.Score, 
 
       title: source.Child && source.Child[0] && source.Child[0].TreeNodePredicate && source.Child[0].TreeNodePredicate.FieldPredName || '', 
 
       desc: source.ScoreDistribution[0].join(', ') 
 
      } 
 
     }; 
 

 
    if (Array.isArray(source.Child)) { 
 
     target.children = source.Child.map(convert); 
 
    } 
 
    return target; 
 
} 
 

 
var treeModel = { TreeModel: { AlgorithmName: "CART", Child: [{ RecordCount: 47, Score: "1", ScoreDistribution: [[24, 23], [0.5106382978723404, 0.4893617021276596]], TreeNodePredicate: { FieldPredID: 0, FieldPredName: "Attribute1", FieldValue: 0, Operator: "EQUAL", PredicateType: "SimplePredicate" } }, { RecordCount: 214, Score: "0", ScoreDistribution: [[2, 212], [0.009345794392523364, 0.9906542056074767]], TreeNodePredicate: { FieldPredID: 0, FieldPredName: "Attribute1", FieldValue: 1, Operator: "EQUAL", PredicateType: "SimplePredicate" } }], RecordCount: 261, Score: "0", ScoreDistribution: [[26, 235], [0.09961685823754787, 0.9003831417624522]], TreeNodePredicate: { PredicateType: "TruePredicate" } } }, 
 
    chart_config = { chart: { container: "#tree-simple" }, nodeStructure: convert(treeModel.TreeModel) }; 
 

 
console.log(chart_config);
.as-console-wrapper { max-height: 100% !important; top: 0; }