2013-07-12 60 views
0

我有一個函數使用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仍然在每個字符串中。

我毫不懷疑我正在做一些愚蠢的事情,但無論出於什麼原因我都看不到它。

在此先感謝!

+2

由於bucket只是一個字符串,因此它不是一個引用,因此更改它並不會更改存儲在數組中的內容。您需要通過索引直接在數組上進行更改。 –

回答

4

你必須使用的其他參數_.each給你的回調:

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

這樣做的原因是,bucket本身是一個字符串的引用;用你自己的引用替換引用不會替換存儲在集合中的引用(它始終指向未修改的版本)。相反,target[i]確實會更新集合,所以即使在回調返回後,更改也是可見的。

+0

太棒了!謝謝! – RockyMountainHigh

相關問題