【问题标题】:Recursive function to traverse object遍历对象的递归函数
【发布时间】:2016-02-11 17:46:51
【问题描述】:

我需要遍历以下对象并将包括子作业在内的所有作业作为线性数组返回:

var o = {
    id: 1,
    subJobs: {
        a: {
            id: 2,
            subJobs: {}
        },
        c: {
            id: 3,
            subJobs: {
                b: {
                    id: 4,
                    subJobs: {}
                }
            }
        }
    }       
}

这是我写的函数:

function parseSubJobs(job) {
    var jobs = [];
    if (Object.keys(job.subJobs).length > 0) {
        for (var key in job.subJobs) {
            var j = parseSubJobs(job.subJobs[key]);
            Array.prototype.push.apply(jobs,j);
        }
        jobs.push(job);
        return jobs;
    }

    return [job];
}

var parsed = parseSubJobs(o);

它工作正常,但在我看来,解决方案可以改进。我对递归不是很好,所以可以改进吗?

【问题讨论】:

  • 如果您有工作代码,并且您只是在寻找优化帮助,那么您最适合前往codereview.stackexchange.com。我们在这里帮助修复损坏的代码,而不是(可能)错误的代码。

标签: javascript recursion


【解决方案1】:

是的,可以。

  1. job初始化jobs
  2. 跳过if (Object.keys(job.subJobs).length > 0) {(见第4点)
  3. 遍历键
  4. 将函数更改为只有一个出口的函数。

var o = { id: 1, subJobs: { a: { id: 2, subJobs: {} }, c: { id: 3, subJobs: { b: { id: 4, subJobs: {} } } } } };

function parseSubJobs(job) {
    var jobs = [job];
    Object.keys(job.subJobs).forEach(function (key) {
        jobs = jobs.concat(parseSubJobs(job.subJobs[key]));
    });
    return jobs;
}

var parsed = parseSubJobs(o);
document.write('<pre>' + JSON.stringify(parsed, 0, 4) + '</pre>');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2011-04-18
    • 2018-04-23
    • 2010-12-08
    • 2020-09-26
    相关资源
    最近更新 更多