JSON问题给你们。
假设我有一个类似的JSON对象,每个节点都是一个带有ID和其他节点数组的对象:
var tree = {
id: 0,
items: [{
id: 48,
items: [{id: 67, items :[]}]
}, {
id: 126,
items: []
}]
}
假设我想在适当的节点上使用新的项目数组更新对象。因此,例如,使用上面的树对象将发生以下情况:
function updateTree(id, array) {
//code goes here
}
var data = [{id: 121, items :[]}]
tree = UpdateTree(67, data)
和树会相等:
tree = {
id: 0,
items: [{
id: 48,
items: [{id: 67, items : [{id: 121, items :[]}]}]
}, {
id: 126,
items: []
}]
}
我如何在这里实现updateTree?递归正在撕裂我的大脑。谢谢!这是一个小提琴:https://jsfiddle.net/nus2jyvg/
答案 0 :(得分:4)
'intlist[2,4,6,8]'
答案 1 :(得分:1)
首先,为了使其以递归方式工作,最好始终具有相同类型的参数。所以我所做的是将主JSON对象封装在一个数组中。现在在这个主阵列上调用updateTree
。现在我遍历给定数组中的所有对象,如果它的id
匹配,我们找到了元素,否则,在当前元素上调用updateTree
。所以这是深度优先搜索算法。我继续尽可能深入层次结构,然后当你点击一个叶子节点(一个没有项目的节点)时,你会返回一个级别;并评估该级别的下一个节点。我还返回一个布尔值来表示找到匹配,这样我就可以立即停止遍历并返回boolean冒泡。这是代码。
var tree = [{
id: 0,
items: [{
id: 48,
items: [{id: 67, items :[]}]
}, {
id: 126,
items: []
}]
}];
function updateTree(tree1,id, arrayArg) {
var result = false;
var i=0;
for(i=0;i<tree1.length;i++){
if(tree1[i].id == id){
console.log("match "+tree1[i].id);
tree1[i].items=arrayArg;
break;
}
else{
result = updateTree(tree1[i].items,id,arrayArg);
if(result){break;}
}
}
if(i==tree1.length){result=false;}
else{result = true;}
return result;
}
var data = [{id: 121, items :[]}];
var temp = tree; // do a full array copy to preserve original variable, I'm manipulating the main one. Laziness.
var ttree = updateTree(temp,67, data);
console.log(temp);
答案 2 :(得分:0)
如果希望递归,还需要将树传递给函数。我不知道JScript,但在Python中:
tree = {'id': 0,'items': [{'id': 48,'items': [{'id': 67, 'items' :[]}]}, {'id': 126, 'items': []}]}
data = [{'id': 121, 'items' :[]}]
def UpdateTree(tree, node, data):
if tree['id'] == node: # check if its the ID you want
tree['items'] = data # update it and return
return
for item in tree['items']: # else go deeper
UpdateTree(item, node, data)
UpdateTree(tree, 67, data)
您可以在Javascript中轻松复制此内容。像这样,我想:
function UpdateTree(tree, node, data){
if (tree.id == node){
tree.items = data;
return;
curr_tree_list = tree.items;
for (var i = 0; i < curr_tree_list.length; i++){
UpdateTree(curr_tree_list[i], node, data);
}
}