JavaScript:函数不修改实际数组

时间:2015-03-17 13:32:14

标签: javascript arrays node.js

我有这样的数组:

[ 'markdown', [ 'para', '\'example\'' ] ]

我有一个函数可以递归地找到这些数组中的字符串:

function traverse(tree, callback) {
  for (var i = 0; i < tree.length; ++i) {
    if (_.isArray(tree[i]) || _.isObject(tree[i])) {
      traverse(tree[i], callback)
    } else {
      callback(tree[i])
    }
  }
}

问题是,当我执行replace之类的任务时,被替换的内容不是实际的数组,只是其节点的副本。例如:

function replaceQuotes(tree, callback) {

  traverse(tree, function(node) {
    node = node.replace(/'/g, '"')
    console.log(node)
    // outputs: "example"
  })

  callback(null, tree)
}

function showResult(err, tree) {
   console.log(tree)
   // outputs [ 'markdown', [ 'para', '\'example\'' ] ]
}

我该怎么做才能用transverse函数修改实际数组?

(顺便说一下,我正在使用Async Node.js模块。)

1 个答案:

答案 0 :(得分:2)

字符串按值传递 - 这就是您的代码行为方式的原因。一个好的解决方案是让你的回调返回新值,然后稍微修改你的遍历:

function tranverse(tree, callback) {
  for (var i = 0; i < tree.length; ++i) {
    if (_.isArray(tree[i]) || _.isObject(tree[i])) {
      tranverse(tree[i], callback)
    } else {
      tree[i] = callback(tree[i]) // changed part
    }
  }
}

然后你会像这样使用它:

function replaceQuotes(tree, callback) {

  tranverse(tree, function(node) {
    return node.replace(/'/g, '"')
  })

  console.log(tree)
  // outputs [ 'markdown', [ 'para', '\'example\'' ] ]

  callback(null, tree)
}