JavaScript:如何在函数之外循环这些项?

时间:2015-03-11 13:35:55

标签: javascript recursion

这是输入:

[ 'markdown',
  [ 'para', '“a paragraph”' ],
  [ 'hr' ],
  [ 'para', '\'another paragraph\'' ],
  [ 'para', 'test--test' ],
  [ 'para', 'test---test' ],
  [ 'bulletlist',
    [ 'listitem', '“a list item”' ],
    [ 'listitem', '“another list item”' ] ] ]

我正在使用此函数来(递归地)查找这些数组中的每个字符串:

function findRecur(tree) {
  for (var i = 1; i < tree.length; i++) {
    if (Array.isArray(tree[i]))
      findRecur(tree[i])
    else
      console.log(tree[i])
  }
}

function anotherFunc(tree, callback) {
  findRecur(tree)

  callback(null, tree) 
}

输出:

"a paragraph"
'another paragraph'
test--test
test---test
"a list item"
"another list item"

我想改为console.log以外anotherFunc。所以我这样做了:

function findRecur(tree) {
  for (var i = 1; i < tree.length; i++) {
    if (Array.isArray(tree[i]))
      findRecur(tree[i])
    else
      return tree[i]
  }
}

function anotherFunc(tree, callback) {
  findRecur(tree, function(node) {
     console.log(node)
  })

  callback(null, tree) 
}

但是没有输出。我想我必须向findRecur添加第二个参数,但不太确定如何以及如何。

任何建议?

2 个答案:

答案 0 :(得分:2)

是的,您需要在findRecur功能中添加回调参数。将两个参数传递给只查看第一个参数的函数是没有意义的。

function findRecur(tree, callback) {
    for (var i = 1; i < tree.length; i++) {
        if (Array.isArray(tree[i])) {
            findRecur(tree[i], callback);
        } else {
            callback(tree[i]);
        }
    }
}

然后你可以这样调用你的函数:

findRecur(data, function(text) { console.log(text); });

或者就像这样:

findRecur(data, console.log);

答案 1 :(得分:0)

findRecur需要将被调用的函数,它应该在else

中调用它

所以例如

function findRecur(tree, fn) {
  for (var i = 1; i < tree.length; i++) {
    if (Array.isArray(tree[i]))
      findRecur(tree[i])
    else
      fn(tree[i])
  }
}