3

私はこのようなjsonデータを持っています:

Data = [{"Id":"1", "Name":"abc", "Parent":""}, {"Id":"2", "Name":"abc", "Parent":"1"},
{"Id":"3", "Name":"abc", "Parent":"2"},{"Id":"4", "Name":"abc", "Parent":"2"}]

このデータを次のような階層ツリーに変換したい:

root: {
        Id:"1",
        Name:"abc", 
        Parent:"",
        0: {
            Id:"2",
            Name:"abc",
            Parent:"1",
             0:{
                Id:"3",
                Name:"abc",
                Parent:"2",
             1:{
                Id:"4",
                Name:"adb",
                Parent:"2",
.....
}

現在、配列オブジェクトとしてのみ作成するという考えがありますが、その形式は機能しません。sapui5 の TreeTable にこの形式が必要だからです。

ご協力ありがとうございました。

4

1 に答える 1

5

通常、子ノードを保持するための配列があるため、JSON の例は完全には意味がありません。しかし、これはさまざまな構造に簡単に適応できるはずの例です。最適化の余地があり、いくつかのループを組み合わせてコードをわずかに効率化できます。コードをより理解しやすくするために、すべてのものを別のループに分けました。確かに他のアプローチもありますが、これはその1つです:

var data = [{"Id":"1", "Name":"abc", "Parent":""}, {"Id":"2", "Name":"abc", "Parent":"1"}, {"Id":"3", "Name":"abc", "Parent":"2"},{"Id":"4", "Name":"abc", "Parent":"2"}];

// flatten to object with string keys that can be easily referenced later
var flat = {};
for (var i = 0; i < data.length; i++) {
  var key = 'id' + data[i].Id;
  flat[key] = data[i];
}

// add child container array to each node
for (var i in flat) {
  flat[i].children = []; // add children container
}

// populate the child container arrays
for (var i in flat) {
  var parentkey = 'id' + flat[i].Parent;
  if (flat[parentkey]) {
    flat[parentkey].children.push(flat[i]);
  }
}

// find the root nodes (no parent found) and create the hierarchy tree from them
var root = [];
for (var i in flat) {
  var parentkey = 'id' + flat[i].Parent;
  if (!flat[parentkey]) {
      root.push(flat[i]);
  }
}

// here it is!
window.console.log(root);
于 2013-05-14T22:15:35.143 に答える