在Nodejs中recursion地进行处理

[ { name: 'test1', fields: [ { name: 'test11', fields: [ { name: 'test111', fields: [ { name: 'test1111' } ] } ] } ] }, { name: 'test2', fields: [ { name: 'test21' }, { name: 'test22' } ] } 

]

我想要在nodejs中recursion地处理上述数组中的字段名称。 由于nodejsasynchronous行为,回路不工作。

你需要定义“过程”。 如果是同步的东西,显然没什么特别的:

 function visit (visitor, obj) { if (Array.isArray(obj)) return obj.forEach(visit.bind(null, visitor)) if (Array.isArray(obj.fields)) obj.fields.forEach(visit.bind(null, visitor)) visitor(obj) } function visitor (obj) { console.log(obj.name) } visit(visitor, data) 

如果在visitor想要asynchronous的东西,有很多select。 假设你想处理第一个节点的子节点(并行),然后节点本身:

 // the order of arguments is weird, but it allows to use `bind` function visit (visitor, callback, obj) { var array if (Array.isArray(obj)) array = obj if (Array.isArray(obj.fields)) array = obj.fields if (!array) return visitor(obj, callback) // number of pending "tasks" var pending = array.length var done = false function cb () { // ensure that callback is called only once if (done) return if (!--pending) { done = true // after all children are done process the node itself if (!Array.isArray(obj)) return visitor(obj, callback) //if the whole node is array callback() } } array.forEach(visit.bind(null, visitor, cb)) } function visitor (obj, callback) { process.nextTick(function () { console.log(obj.name) callback() }) } visit(visitor, after, data) function after () { console.log('all done') } 

它基本上是相同的代码,但callback加上一些asynchronousstream程控制代码。 当然,你也可以使用async包。