递归搜索和更新JSON对象

时间:2016-01-28 00:16:02

标签: json recursion

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/

3 个答案:

答案 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);
    }
}