Как преобразовать дерево в объект JSON? - PullRequest
0 голосов
/ 27 апреля 2011

У меня есть это дерево, и я хотел бы преобразовать его в JSON, чтобы использовать его в дереве параметров jquery .

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

Дерево должно выглядеть следующим образом:

boats
cars
- oldtimer
- trucks
-- heavytrucks

каждый элемент имеет идентификатор.

Как я могу преобразовать это в 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 не имеет идентификатора, он имеет только дочерние элементы.

Может быть, кто-то может помочь.

1 Ответ

2 голосов
/ 27 апреля 2011

Этот фрагмент кода преобразует ваши входные данные в дерево

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?
...