将项目推入JavaScript中的多维树状结构

时间:2015-02-24 12:04:33

标签: javascript arrays json graph tree

我有一个像这样的对象的数组

var obj = [{
    id: 23,
    name: 'Test1',
    children: [{
         id: 24,
         name: 'Test2,
         children: [..]
    },{
         id: 25,
         name: 'Test2,
         children: [..]
    }],
},{..}]

每个孩子可以有多个子孩子,所以基本上我试图表示一个类似于结构的图形,类似于htmlparser的输出。

我需要这样的功能:

function(nodeId, json){}

该函数需要使用nodeId在树中查找json对象,并将json作为该父对象的子项插入。那就是我被困住的地方。

我尝试编写这样的递归函数来搜索适当的节点,但是,当我必须将json插入到实际的obj数组中时会出现问题。

function findNode(nodeId, json, obj){
    if(obj.id == nodeId){
        obj.children.push(json);
    }
    else{
        for(var i=0; i<obj.children.length; i++){
            findNode(nodeId, json, obj.children[i]);
        }
    }
}

似乎json被插入到递归函数的obj本地,而不是实际的根obj。我怎样才能将它插入父obj?

2 个答案:

答案 0 :(得分:4)

首先,查看对象的结构,看起来根对象的结构是错误的。根对象不能是您打算拥有的对象的数组。要利用递归,您应该具有在所有级别上相似的结构。

你的功能实现几乎是正确的。

我只希望你没有将JSON字符串作为json参数传递;如果你是,你必须使用JSON.parse(json)

解析它并创建一个JS对象

以下是更新后的实施:

var obj = {
    id: 23,
    name: 'Test1',
    children: [{
         id: 24,
         name: 'Test2',
         children: []
    },{
         id: 25,
         name: 'Test2',
         children: []
    }],
};

var objToBePushed = {
    id: 26,
    name: 'Test3',
    children: [{
         id: 27,
         name: 'Test4',
         children: []
    }]
};

function findNode(nodeId, json, node){
    if(node.id == nodeId){
        node.children.push(json);
    }
    else{

        for(var i=0; i<node.children.length; i++){
            findNode(nodeId, json, node.children[i]);
        }
    }
}

findNode(24, objToBePushed, obj);
console.log(obj);

使用JSFiddle:http://jsfiddle.net/ef3ewoag/2/

答案 1 :(得分:-1)

你必须返回对象

检查一下:

http://jsfiddle.net/rf7ysasy/

var obj = [{
    id: 23,
    name: 'Test1',
    children: [{
         id: 24,
         name: 'Test2',
         children: []
    },{
         id: 25,
         name: 'Test2',
         children: []
    }],
}];

var findNode = function(nodeId, json, o){
    if(o.id == nodeId){
        o.children.push(json);
    }
    else{
        if(o.children){
            for(var i=0; i<o.children.length; i++){
                o.children[i] = findNode(nodeId, json, o.children[i]);
            }
        }
    }
    return o;
};

obj = findNode(24,{
         id: 26,
         name: 'Test2',
         children: []
    }, obj);
console.log (obj);