我需要遍历以下对象并将所有作业(包括子作业)作为线性数组返回:
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 :(得分:2)
是的,它可以。
jobs
job
if (Object.keys(job.subJobs).length > 0) {
(见第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>');
&#13;