簡體   English   中英

JavaScript:函數未修改實際數組

[英]JavaScript: Function not modifying the actual array

我有這樣的數組:

[ '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函數修改實際數組?

(順便說一句,我正在使用異步 Node.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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM