Javascript 给定字符串如何用数组中的多个单词替换某些单词?

Javascript 给定字符串如何用数组中的多个单词替换某些单词?,javascript,arrays,regex,array-splice,Javascript,Arrays,Regex,Array Splice,假设我有一个句子和一系列单词: let sentence = 'My * is * years old.'; let words = ['dog', 3]; //expected result => My dog is 9 years old. 如何用给定数组中的适当单词替换每个星号(*)? 但我们也可以说,在某些情况下,数组中的星号比元素多: let sentence = 'The soldiers marched *, *, *, *.'; let words = ['left',

假设我有一个句子和一系列单词:

let sentence = 'My * is * years old.';
let words = ['dog', 3];

//expected result => My dog is 9 years old.
如何用给定数组中的适当单词替换每个星号(*)? 但我们也可以说,在某些情况下,数组中的星号比元素多:

let sentence = 'The soldiers marched *, *, *, *.';
let words = ['left', 'right'];

//expected result => The soldiers marched left, right, left, right.
使用regex是解决这个问题的唯一方法还是有一个普通的JS解决方案?

让句子='我的*岁';
让单词=['dog',3];
让计数=0;
while(句子.indexOf('*')>-1){
句子=句子。替换('*',单词[count++]);
如果(count>=words.length)count=0;
}

控制台日志(句子)您可以使用一个替换函数,为起始索引添加一个附加值,默认值为零

为了使索引保持在一个有效范围内,可以使用数组的长度

const
replace=(字符串,数组,i=0)=>
string.replace(/\*/g,\=>array[i++%array.length]);
log(替换('My*已经*岁了',['dog',3]);

console.log(替换('士兵行进*,*,*,*,*。,['左','右'))如果您确实不喜欢正则表达式,可以这样做:

words = ["left", "right"];
"The soldiers marched *, *, *, *.".split("*").map(function (x, i) {
  return i === 0 ? x : words[(i + 1) % words.length] + x;
}).join("");
执行痕迹:

init |“士兵们行进*,*,*,*,*。”
斯普利特[“士兵们行进了”、“、”、“、”、“、”、“、”、“、”、“、”、”]
i=0 |[“士兵们行进”、“、”、“、”、“、”、“、”、“、”、“、”]
i=1 |[“士兵们行进”,“左”,“左”,“右”,“右”,“右”,“右”,“右”,“右”,“右”]
i=2 |[“士兵们行军”,“左”,“右”,“右”,“右”,“右”,“左”,“右”]
i=3 |[“士兵们行进”,“左”,“右”,“左”,“左”]
i=4 |[“士兵行进”,“左”,“右”,“左”,“右”。]
加入|“士兵们向左、向右、向左、向右行进。”

另一个无regexp选项:

s = "The soldiers marched *, *, *, *.";
f = Function("words", "var i = 0; return \"" + s.split("*").join(
  "\" + words[(i++) % words.length] + \""
) + "\";");
f([“L”,“R”]) <|“士兵们向左、右、左、右行进。” >| f([“L”,“R”]。反向() <|“士兵们行进着,左,右,左。” >| f([“L”、“R”、“R”]) <|“士兵们向左、右、右、左行进。”
但请注意恶意代码:

s = "The soldiers marched *, *, *, *.";
s = "\", console.log(\"VIRUS ATTACK!!! CALL +XX-XXXXX-XXXXX NOW!!!\"), \"" + s;
f = Function("words", "var i = 0; return \"" + s.split("*").join(
  "\" + words[(i++) % words.length] + \""
) + "\";");
f([“L”,“R”]) |病毒攻击!!!立即拨打+XX-XXXXX-XXXXX!!! <|“士兵们向左、右、左、右行进。”
您应始终清理输入:

s = "The soldiers marched *, *, *, *.";
s = "\", alert(\"VIRUS ATTACK!!! CALL +XX-XXXXX-XXXXX NOW!!!\"), \"" + s;
s = s.split("\"").join("\\\""); // potentially not sufficient!
f = Function("words", "var i = 0; return \"" + s.split("*").join(
  "\" + words[(i++) % words.length] + \""
) + "\";");
f([“L”,“R”]) 士兵们向左、右、左、右行进
但我不敢说它是防弹的:-

一个接一个的字符:

input=“士兵行进*,*,*,*”;
单词=[“左”、“右”];
output=“”
对于(i=0,j=0;iconsole.log(输出)
您尝试过什么吗?是的,这在vanilla js中是可能的。正则表达式内置于js中,所以它是vanilla js。你想出了什么使用正则表达式的解决方案?可以重新调整它的用途,使其不使用正则表达式。将来,请不要在不适合您的问题的问题上添加标记。我已经删除了functional programming标签,因为这与functional programming无关。您可以将鼠标悬停在标记上,以获取其内容的简短描述。要知道,很多网站的普通用户都会使用某些标签,我们可能会对突然出现的与我们的兴趣无关的问题感到有点生气。其次,更不重要的是,正则表达式是普通的js:)我想从索引的偏移量开始。(除了必要变量的声明和初始化之外。)