我有一个包含节点和子节点的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树的值?
提前致谢
答案 0 :(得分: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;
}
}
答案 1 :(得分:1)
那不是JSON,它是一个Javascript对象文字。 JSON是将简单的Javascript对象编码为字符串的某种方式;你的例子不是那样写的。此外,您的代码不会操纵JSON对象(实际上是字符串,而不是对象);它操纵Javascript对象(这是一种更简单的任务)。
那就是说,我不确定你的实际问题是什么,但是如果要将新元素添加到children
数组中,你可以使用Array.push:
findNode.find("nodeid_3",json);
findNode.node.children.push(child);
(这假设findNode.find实际上有效,我很确定它没有。)