JavaScript:不修改实际数组的函数

JavaScript: Function not modifying the actual array

本文关键字:数组 函数 修改 JavaScript      更新时间:2023-09-26

我有这样的数组:

[ '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 函数修改实际数组?

(顺便说一下,我正在使用异步节点.js模块。

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

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)
}