2016-02-11 101 views
1

我需要遍历下列对象,并返回所有工作,包括子作业线性阵列:递归函数来遍历对象

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

它行得通,但在我看来,解决方案可以改进。递归不太好,所以可以改进?

+0

如果你有工作代码,你只是在寻找优化的帮助,你是最适合的标题到http://codereview.stackexchange.com/。我们帮助修复了破碎的代码,而不是(可能)错误的代码。 – Oka

+0

@哦,好的,谢谢 –

回答

2

是的,它可以。

  1. Iinitialize jobsjob
  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>');