使用Nodejs递归处理

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

我希望能够在nodejs中递归地处理上述数组中的字段名。由于nodejs的异步行为,循环无法正常工作。

1个回答

1
你需要定义“进程”。如果它是同步的,那么没有什么特别的,显然:
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”中进行异步操作,有很多选择。假设您想首先并行处理第一个节点的子节点,然后再处理该节点本身:
// 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')
}

这基本上是相同的代码,但添加了回调函数和一些异步流程控制代码。当然,您也可以使用async包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接