[英]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.