我有这样的数组:
[ '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模块。)
答案 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)
}