在for循环中使用String.replace

时间:2015-05-25 21:26:57

标签: javascript for-loop str-replace

for (var z = 0; z < spells[0].vars.length; z++) {
    if (spells[0].sanitizedTooltip.indexOf(spells[0].vars[z].key) > -1) {
        var key = spells[0].vars[z].key;
        sanitizedOut = spells[0].sanitizedTooltip.replace("{{ " + key + " }}", spells[0].vars[z].coeff);
    }
}

这段代码旨在替换字符串中的多个“键”。但是,只有最后一次出现被替换。

  

投掷匕首造成{{e2}}(+ {{a1}})魔法伤害。匕首   弹跳到4个最接近的敌人,每个敌人造成的伤害降低10%   弹跳。被击中的敌人标记为4秒。卡塔琳娜的基本攻击   或法术将消耗处理{{e3}}(+ {{a2}})的标记   额外的魔法伤害。

这是sanitizedTooltipspells[0].vars是:

[ { key: 'a1', link: 'spelldamage', coeff: [ 0.45 ] }, { key: 'a2', link: 'spelldamage', coeff: [ 0.15 ] } ]

但是,此for循环的结果仅返回:

  

投掷匕首造成{{e2}}(+ {{a1}})魔法伤害。匕首   弹跳到4个最接近的敌人,每个敌人造成的伤害降低10%   弹跳。被击中的敌人标记为4秒。卡塔琳娜的基本攻击   或法术将使用额外处理{{e3}}(+0.15)的标记   魔法伤害。

...其中{{a1}}预计为+0.45。提前谢谢!

2 个答案:

答案 0 :(得分:0)

循环的每次迭代都在原始spells[0].sanitizedTooltip上运行。每次通过时,sanitizedOut都会重新分配最新迭代的结果,因此当循环退出时,您只能看到最后的结果。

答案 1 :(得分:0)

为了帮助您在一次调用中替换所有匹配项,您可以构建一个递归函数,如下所示:

function replaceAll(value, oldChar, newChar) {
   if (value.indexOf(oldChar) > -1) {
      value = value.replace(oldChar, newChar);
      return replaceAll(value, oldChar, newChar);
   } else {
      return value;
   }
}

var s = "A B A B A B A B";
s = replaceAll(s, "A" , "X");
alert(s);

结果将是:X B X B X B X B