猿问

从 JS 中的字符串替换特定元素(唯一或重复)

我的代码会自动在字符串中搜索 /d+d/d+ 元素(掷骰子)并添加随机数后缀并将它们作为元素存储在数组中。

我想用我的数组的新修改元素创建一个新字符串。

(我不想在 Array 中拆分字符串,在一个全新的数组中用另一个数组替换相同的元素,然后将其加入一个字符串。我需要修改它并将其保存在一个新的字符串中)

例子:

字符串通过用户输入更改,因此如果我有:

str = ' I roll 1d3 and 2d4+3 and 1d3 also 1d8 and 1d8 dice ';

然后 mydice(str) 查找所有骰子名称并生成一个新数组,如下所示:

array = [ "1d3:[2]=2" , "2d4:[1,2]+3=6" , "1d3:[1]=1", "1d8:[7]=7", "1d8:[5]=5"] ;

期望输出:

str = ' I roll 1d3:[2]=2 and 2d4:[1,2]+3=6 and 1d3:[1]=1 also 1d8:[7]=7 and 1d8:[5]=5 ';



缥缈止盈
浏览 304回答 2
2回答

牛魔王的故事

仅使用您提供的两个项目作为输入(字符串和带有ndn=(n)单词种类的数组),您可以进行如下操作:let str = ' I roll 1d3 and 2d4+3 and 1d3 also 1d8 and 1d8 dice ';let array = [ "1d3:[2]=2" , "2d4:[1,2]+3=6" , "1d3:[1]=1", "1d8:[7]=7", "1d8:[5]=5"];let i = 0;for (let item of array) {    let find = item.replace(/:.*\]|=.*/g, "");    i = str.indexOf(find, i);    str = str.slice(0, i) + item + str.slice(i + find.length);    i += item.length;}console.log(str);假设数组是格式良好的,即这些项目确实是从字符串中正确导出的,并且等号之前的所有字符串部分(如“1d3”)都出现在字符串中。请注意,字符串是不可变的,因此您不能真正改变字符串。唯一的方法是创建一个新字符串并将其分配回同一个变量。但这不是突变;那就是分配一个新的字符串。

扬帆大鱼

如果我了解您的要求,我认为您的解决方案过于复杂。我会建议这样的事情:const roll = dice => {&nbsp; const [num, max] = dice.split('d');&nbsp; let r = 0;&nbsp; for (let i = 0; i < num; i++) {&nbsp; &nbsp; r += Math.floor(Math.random() * max) + 1;&nbsp; }&nbsp; return r;}let output = input = 'I roll 1d3 and 2d4 and 1d3 also 1d8 and 1d8 dice';const matches = input.match(/\d+d\d+/g);const rolls = matches.map(dice => `${dice}=(${roll(dice)})`);rolls.forEach(roll => {&nbsp; const [dice] = roll.split('=');&nbsp; output = output.replace(new RegExp(` ${dice} `), ` ${roll} `);});console.log('IN:', input)console.log('OUT:', output);
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答