2011-04-27 189 views
0

我有這棵樹,我想將它轉換爲JSON使用它在jquery option tree如何將樹轉換爲JSON對象?

NodeId, Title, Level 
1, cars, 0 
2, boats, 0 
3, oldtimer, 1 
4, trucks, 1 
5, heavytrucks, 4 

樹應該是這樣的:

boats 
cars 
- oldtimer 
- trucks 
-- heavytrucks 

每個項目都有一個ID。

我該如何將其轉換爲JSON?

這個例子將在jQuery的選項樹給出:

var option_tree = { 
    "Option 1": { 
     "Suboption": 200 
    }, 
    "Option 2": { 
     "Suboption 2": { 
      "Subsub 1": 201, 
      "Subsub 2": 202 
     }, 
     "Suboption 3": { 
      "Subsub 3": 203, 
      "Subsub 4": 204, 
      "Subsub 5": 205 
     } 
    } 
}; 

但選項1不要有一個ID,它只有子元素。

也許有人可以幫忙。

+0

選項樹附加到文本框。所以葉值被插入到文本框中,例如在選擇'Option 1'>'Suboption'的例子中,文本框的值爲'200'。在你的樹(汽車,船...)中,葉子值缺失。 – neebz 2011-04-27 13:09:09

+1

我不確定你想要轉換成json的數據來自哪個數據來自你想轉換成json的數據? – mcgrailm 2011-04-27 13:09:20

+0

你想要轉換爲JSON?向我們展示你現在的「樹」。 – 2011-04-27 13:39:55

回答

2

這段代碼將你的輸入轉換成樹

var lines = 
    ('1, cars, 0\n' + 
    '2, boats, 0\n' + 
    '3, oldtimer, 1\n' + 
    '4, trucks, 1\n' + 
    '5, heavytrucks, 4').split('\n'); 

var tree = []; 
var lookup = {}; // temporary variable 

for (var i in lines) { 
    var items = lines[i].split(', '); 

    var obj = { id: items[0], parent_id: items[2], name: items[1], children: [] }; 
    lookup[obj.id] = obj; 

    if (lookup[obj.parent_id]) { 
     lookup[obj.parent_id].children.push(obj); 
    } else { 
     tree.push(obj); 
    } 
} 

console.log(tree); // will display your tree 

然後你就可以穿越你的樹,並修改它,你怎麼想它的樣子。

例如,這將打印

function walk(root, depth) { 
    var s = ""; for (var i = 0; i < depth; i++) s += '-'; 
    console.log(s + ' ' + root.name); 
    for (var child in root.children) { 
     walk(root.children[child], depth+1); 
    } 
} 

for (var child in tree) 
    walk(tree[child], 1); 

這樣

- cars 
-- oldtimer 
-- trucks 
--- heavytrucks 
- boats 

你同樣可以將其轉換成任何你想要的。

function walk2(root, parent) { 
    if (root.children.length == 0) { 
     parent[root.name] = root.id; 
    } else { 
     parent[root.name] = {} 
     for (var child in root.children) { 
      walk2(root.children[child], parent[root.name]); 
     } 
    } 
} 

var tree2 = {}; 

for (var child in tree) 
    walk2(tree[child], tree2); 

console.log(tree2); // <- is this what you wanted? 
+1

很好地完成了麥克。請注意:您的解決方案不允許未排序的輸入。即,您不能將'0,東西,-1'作爲輸入中的最後一行。 – brianpeiris 2011-04-27 15:31:03