3

我有一个包含节点和子节点的 JSON 树 - 格式为:

jsonObject = 
{
  id:nodeid_1,
  children: [
  {
    id:nodeid_2,
    children:[]
  },
  {
    id:nodeid_3,
    children:[
    {
      id:nodeid_4,
      children:[]
    },
    {
      id:nodeid_5,
      children:[]
    }
  }
}

我不知道这棵树的深度,一个节点能够有很多孩子,也有很多孩子等等。

我的问题是我需要使用 nodeID 将节点添加到此树中。例如,一个可以采用 nodeID 和节点对象(包括其子对象)的函数将能够替换树中的该节点 - 结果将成为一棵更大的树。

我只遇到递归函数,它允许我遍历 JSON 树中的所有节点,并且我对这些函数之一所做的修改返回了节点对象 - 但对我没有帮助,因为我需要修改原始树:

var findNode = {
node:{},
find:function(nodeID,jsonObj) {
    if( typeof jsonObj == "object" ) {
        $.each(jsonObj, function(k,v) {
            if(v == nodeID) {
                findNode.node = $(jsonObj).eq(0).toArray()[0];        
            } else {
                findNode.find(nodeID,v); 
            }
        });
    } else {
        //console.log("jsobObj is not an object");
    }
  }
}

这使我可以进行以下测试:

findNode.find("nodeid_3",json);
alert(findNode.node);

综上所述 - 如何修改深度未知的 JSON 树的值?

提前致谢

4

2 回答 2

1

那不是JSON,它是一个 Javascript 对象文字。JSON 是一种将简单的 Javascript 对象编码为字符串的特定方式;你的例子不是这样写的。此外,您的代码不会操作 JSON 对象(实际上是字符串,而不是对象);它操作 Javascript 对象(这是一个更简单的任务)。

也就是说,我不确定你的实际问题是什么,但如果是关于向children数组添加新元素,你可以使用Array.push

findNode.find("nodeid_3",json);
findNode.node.children.push(child);

(这假设 findNode.find 确实有效,我很确定它不会。)

于 2010-09-13T17:50:17.993 回答
1

如果你想修改一个节点,就像你说的,你可以修改那个节点的属性。

var node = findNode.find("nodeid_3",json);
node.id = "nodeid_3_modified";
node.children = [];

另外,你为什么要为此使用 jQuery?

这是一个不使用 jQuery 的替代方案应该可以工作:

function findNode(object, nodeId) {
   if (object.id === nodeId) return object;

   var result;
   for (var i = 0; i < object.children.length; i++) {
      result = findNode(object.children[i], nodeId);
      if (result !== undefined) return result;
   }
}
于 2010-09-13T17:32:59.713 回答