遍历对象的递归函数

时间:2016-02-11 17:46:51

标签: javascript recursion

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

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);

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

1 个答案:

答案 0 :(得分:2)

是的,它可以。

  1. 使用jobs
  2. 初始化job
  3. 略过if (Object.keys(job.subJobs).length > 0) {(见第4点)
  4. 迭代密钥
  5. 将功能更改为只有一个退出的功能。
  6. 
    
    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>');
    &#13;
    &#13;
    &#13;