0

我有一个函数,它使用 underscore.js 每个函数来调用列表中每个项目的字符串替换。(实际上是一对列表):

//基础对象
桶 = {
  计数器:[“stats.REPLACE.msg_delivered”,
              "stats.REPLACE.delivery_failed"],
  计时器:[“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”]
};

//有问题的函数
_getNodeTargets = 函数(节点){
  var 目标 = 桶;
  _.each(targets.counters, function(bucket) { bucket = bucket.replace("REPLACE", node);});  
  _.each(targets.timers, function(bucket) { bucket = bucket.replace("REPLACE", node);});
  返回目标;
}

我可以进入每个函数,看到字符串被替换并分配回存储桶。但是,当我点击返回时,目标对象没有改变,每个字符串中仍然存在 REPLACE。

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

提前致谢!

4

1 回答 1

4

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

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

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

于 2013-07-12T21:01:27.300 回答