为什么我的批量替换功能不起作用?

时间:2013-07-12 20:55:55

标签: javascript underscore.js

我有一个函数,它使用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仍在每个字符串中。

我毫不怀疑我正在做一些愚蠢的事,但无论出于什么原因我都看不到它。

提前致谢!

1 个答案:

答案 0 :(得分:4)

你必须使用其他参数_.each给你的回调:

_.each(targets.counters,
      function(bucket, i, target) {
          target[i] = bucket.replace("REPLACE", node);
      });

原因是bucket本身是对字符串的引用;用您自己的引用替换该引用也不会替换存储在集合中的引用(它始终指向未修改的版本)。相比之下,target[i]确实会更新集合,因此即使在您的回调返回后,更改仍然可见。