繁体   English   中英

在for循环中使用String.replace

[英]Using String.replace in a for loop

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}})额外的魔法伤害。

这是sanitizedTooltip spells[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。 提前致谢!

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

为了帮助您替换单个调用中的所有事件,您可以构建一个递归函数,如下所示:

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);

结果将是: XBXBXBXB

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM