我有一个函数,它使用underscore.js每个函数只调用列表中每个项目的字符串替换。 (实际上是一对列表):
//Base object buckets = { counters: ["stats.REPLACE.msg_delivered", "stats.REPLACE.delivery_failed"], timers: ["stats.timers.REPLACE.msg_delivery_timer.median", "stats.timers.REPLACE.msg_delivery_timer.mean", "stats.timers.REPLACE.msg_delivery_timer.std", "stats.timers.REPLACE.msg_delivery_timer.upper"] }; //function in question _getNodeTargets = function(node) { var targets = buckets; _.each(targets.counters, function(bucket) { bucket = bucket.replace("REPLACE", node);}); _.each(targets.timers, function(bucket) { bucket = bucket.replace("REPLACE", node);}); return targets; }
我可以进入每个函数,看到字符串被替换并分配回存储桶。但是,当我点击返回时,目标对象不变,REPLACE仍在每个字符串中。
我毫不怀疑我正在做一些愚蠢的事,但无论出于什么原因我都看不到它。
提前致谢!
答案 0 :(得分:4)
你必须使用其他参数_.each
给你的回调:
_.each(targets.counters,
function(bucket, i, target) {
target[i] = bucket.replace("REPLACE", node);
});
原因是bucket
本身是对字符串的引用;用您自己的引用替换该引用也不会替换存储在集合中的引用(它始终指向未修改的版本)。相比之下,target[i]
确实会更新集合,因此即使在您的回调返回后,更改仍然可见。