优化嵌套对象行走

时间:2016-03-26 02:27:28

标签: javascript

我有一个嵌套的对象结构,我对每个对象执行一系列操作,然后将其推送到一个数组。我目前的代码如下:

var item;
var final_data = [];

function walk (items, level) {
    for (var i = 0; i < items.length; i++) {
        item = items[i];

        var final_item = Object.assign({}, item); // <-- required step, object's proper key/values must be cloned, but not recursively.
        delete final_item.children; // final_item shouldn't have children

        final_item.foo = level;

        final_data.push(final_item);

        if ("children" in item) walk(item.children, level + 1);
    }

}

walk(my_data, 0);

我当前的代码按预期工作,因为它会使输入数据变平。

我的问题是,是否有办法改进该代码(性能明智)。

编辑:

my_data是嵌套对象的数组,如下所示:

my_data = [
    {a: 1, b: 2},
    {a: 3, b: 8},
    {a: 9, b: 3, children: [
        {...}, {...}, {...}
    ]},
    {...},
    {..., children: [{}, {}, {}...]}
];

3 个答案:

答案 0 :(得分:1)

我唯一可以立即看到的是通过将.length分配给变量来优化你的循环

即:

for (var i = 0, j = items.length; i < j; i++)

而不是

for (var i = 0; i < items.length; i++)

以下是另一篇文章的答案,以获得更多见解: Javascript Optimizing Loops

答案 1 :(得分:1)

要删除递归,我使用数组作为堆栈并访问&#34; my_data&#34;的所有节点。找出是否有孩子并将所有孩子推上堆叠。 然后,删除子项并在最终结果中推送受访节点

git merge --log --no-commit BranchB
git revert --no-commit BadCommit1 BadCommit2...
git commit

答案 2 :(得分:-1)

如果你想要表现,是的,它肯定会得到改善。 Object.assign是不必要的,并且在javascript中对象创建和销毁效率极低。与去除变量相比,赋予变量长度的增益可以忽略不计。