javascript - 递归创建一个 JSON 树,仅在最深层次添加

标签 javascript recursion

我想创建一个未知对象的JSON层次结构,所以必须递归处理。

这是我的函数,其中 angular.element.isEmptyObject() 继承自 jQuery,而 angular.copy() 是一个创建对象(我正在使用 AngularJS )。

function recurseTree(tree, newKey, newId) {
    if(angular.element.isEmptyObject(tree)) {
        tree[newKey] = {_id: newId};
    } else {
        for(var key in tree) {
            if(typeof tree[key] == 'object') recurseTree(tree[key], newKey, newId);
            else tree[newKey] = {_id: newId};
        }
    }
    return angular.copy(tree);
}

现在运行这个:

var testT = {};
console.log(recurseTree(testT, 'a', '1'));
console.log(recurseTree(testT, 'b', '2'));
console.log(recurseTree(testT, 'c', '3'));
console.log(recurseTree(testT, 'd', '4'));
console.log(recurseTree(testT, 'e', '5'));

您会注意到第一个和第二个按预期返回:

{ 
    a: { 
        _id: '1',
        b: {
            _id: '2'
        }
    }
}

但第三个是我遇到麻烦的地方。

{ 
    a: { 
        _id: '1',
        b: {
            _id: '2',
            c: {
                _id: '3'
            }
        },
        c: {
            _id: '3'
        }
    }
}

我需要修复什么才能让 c 对象作为 b 的子对象,而不是作为 b 的子对象一个?我很难过。

这是它的一个 JSFiddle 运行,检查你的控制台的结果。 http://jsfiddle.net/winduptoy/Mjq5D/2/

最佳答案

试试这个:

function recurseTree(tree, newKey, newId) {
    if(angular.element.isEmptyObject(tree)) {
        tree[newKey] = {_id: newId};
        return;
    } 

    var child = null; // find current tree's child
    for(var key in tree) {
        if (key != '_id') {
            child = tree[key]; // found a child
            break;
        }
    }
    if (child) { // recursively process on child
        recurseTree(child, newKey, newId);
    } else { // no child, so just fill the tree
        tree[newKey] = {_id: newId};
    }
}

测试:

var testT = {};
recurseTree(testT, 'a', '1');
console.log(testT);  
recurseTree(testT, 'b', '1');
console.log(testT); 
recurseTree(testT, 'c', '1');
console.log(testT); 
recurseTree(testT, 'd', '1');
console.log(testT); 
recurseTree(testT, 'e', '1');
console.log(testT);

请注意,出于性能考虑,我没有使用 angular.copy(tree)。 如果您不想更改树,请在将其传递给函数 recurseTree 之前复制它。请在 jsFiddle 上试用.

关于javascript - 递归创建一个 JSON 树,仅在最深层次添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14087914/

相关文章:

javascript - knockoutjs中方法的区别

javascript - 如何将谷歌字体添加到 React Native?

javascript - 返回此递归循环的累积字符串

c - 恢复 C (gcc) 中的递归函数?

javascript - 如何在剑道列模板中为元素设置弹出位置的 anchor

javascript - 无法从 getSheetValues() 获取值

javascript - 从 JSON 对象 Javascript 中删除记录

java - 反向字符串递归方法

ruby - 当我传入数组时,为什么我的串联会困惑?

Java:在线程池中共享多个递归任务的工作人员