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

Javascript 替换JS中字符串中的特定元素(唯一或重复),javascript,replace,duplicates,unique,Javascript,Replace,Duplicates,Unique,我的代码会自动在字符串中搜索/d+d/d+元素(掷骰子),并添加随机数后缀,并将它们作为元素存储在数组中 我想用数组中新修改的元素创建一个新字符串 (我不想拆分数组中的字符串,用全新数组中的另一个数组替换相同的元素,然后将其连接到字符串。我需要修改它并将其保存在新字符串中) 例如: 字符串通过用户输入更改,因此如果我有: str = ' I roll 1d3 and 2d4+3 and 1d3 also 1d8 and 1d8 dice '; 然后mydice(str)查找所有骰子名称并生成一

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

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

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

例如:

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

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

仅使用您提供的两项作为输入(字符串和带有
ndn=(n)
类单词的数组),您可以按如下方式进行操作:

let str='我掷1d3和2d4+3,1d3也掷1d8和1d8骰子';
设数组=[“1d3:[2]=2”,“2d4:[1,2]+3=6”,“1d3:[1]=1”,“1d8:[7]=7”,“1d8:[5]=5”];
设i=0;
for(数组的let项){
让find=item.replace(/:.*\]|=.*/g,“”);
i=str.indexOf(find,i);
str=str.slice(0,i)+item+str.slice(i+find.length);
i+=项目长度;
}

console.log(str)如果我了解您的需求,我认为您的解决方案过于复杂。我建议这样做:

const roll=dice=>{
常量[num,max]=骰子分割('d');
设r=0;
for(设i=0;i`${dice}=(${roll(dice)})`);
rolls.forEach(roll=>{
常量[骰子]=掷骰分割('=');
output=output.replace(新的RegExp(`${dice}`)、`${roll}`);
});
console.log('IN:',input)

console.log('OUT:',output)“我需要修改原始字符串”:您不能。在JS中,字符串是不可变的。无论您使用什么进程,都必须返回一个新字符串。AFAIK再次拆分和加入是唯一的选择way@Andy我编辑这行文字以便更好地解释。我的意思是我不想要一个简单的连接(“”)到一个新行。如果我加入“最终”数组我的问题立即得到解决,但这不是我想要的。这真的是。。。古怪的坦率地说,这似乎太复杂了,我不讨厌加入
join
。我想说的是,你可能只需要使用一个字符串
replace
和/或一个带标签的模板,但我不知道你是如何得到
=(n)
的,我也不明白什么是重复的。从你的问题来看,你似乎在展示B点到D点,然后问如何改变一些武断的东西。这个问题的措辞应该更好,不需要讲述已经起作用的故事,而只是以清晰的输入/输出呈现问题,只关注开放的问题。例如,提到重复项似乎与您的实际问题无关,因为您已经有了一个包含要替换项的数组。这使读者感到困惑。只关注一件事,跳过“围绕”你的问题的故事。我编辑了我的问题,并用精确的输出使其更具体。我在代码片段中移动了你修改的输入(数组):现在你似乎有两个分隔符(
=
),你似乎想把
+3
这样的东西分开。如果这是你想要的,请告诉我,但是在你的问题中应该更好地解释这些具体规则。更多的规则是这样的吗?你的解决方案有效!我只添加了
rstr=item.toString()
,并更改了
find=rstr.repl()
I+=rstr.length
,以使我的代码正常工作。再次感谢您的解决方案!很高兴听到。如果您必须执行
toString()
,那么这意味着您的
数组
不是您在问题中提出的字符串数组。感谢Jordi,但是如果用户输入2d4+5或1d2*9等并生成结果“2d4+5:[2,3]+5=10”、1d2*9:[1]+9=10哦,我没有看到这些
+5
,,
*9
和我第一次阅读时允许的其他语法。这不是你的错!这是我的,我编辑,使其更具体的输出!