我刚刚开始学习 JS,所以我提前为这个问题道歉,这对于更有经验的人来说可能看起来很愚蠢。有一个训练代码:
<html>
<script>
let inputWord = 'mappet'
let lettersArr = inputWord.split('');
lettersArr.forEach(function(letter) {
console.log(letter);
let index = lettersArr.findIndex(i => i == letter);
if(lettersArr[index] == 'p' && lettersArr[index + 1] == 'p') {
lettersArr[index] = lettersArr[index] + '—';
}
});
let withTransfer = lettersArr.join("");
alert(withTransfer);
</script>
</html>
如果 inputWord 变量包含单词“mappet”,那么它可以安全地工作,在两个“p”之间插入一个破折号,但如果它包含“pappet”或任何其他单词,其首字母重复了中间的两倍,那么条件不起作用。我认为这是因为 findIndex 它需要第一次出现字母并检查条件。在“pappet”的情况下,第一个条件将是启动所有内容的非双 p,因此它不会满足中间“pp”的条件。
请告诉我如何确保单词 pappet 中的第一个 p 不会干扰在中间插入破折号。我绞尽脑汁却什么也想不出来。
如果我理解正确,那么无论如何都需要
pp替换为p-p. 有几种解决问题的方法(当然,这里不是所有可能方法的完整列表,但本质 + - 将是相同的):如果您只需要替换遇到的第一个(通过正则表达式):
如果您只需要更换遇到的第一个(通过循环):
如果您需要替换所有内容(通过正则表达式)(1):
如果您需要替换所有内容(通过正则表达式)(2):
如果您需要更换所有东西(通过循环)(1):
在此示例中,您需要从数组的末尾开始。因为我们在还没有插入任何内容的时候保存了数组索引。如果你从头开始插入,它只会在第一次插入时正常工作,但在那之后,其他字母的索引会立即改变(我们将它们保持在以前的状态),结果我们将插入一个在错误的地方冲刺。因此,我们从最后开始,这样在插入破折号时,我们可以安全地引用旧索引,因为在插入之后,索引只会改变后续字母,而不是之前的字母
如果您需要更换所有东西(通过循环)(2):
没错,findIndex 方法为数组中存在的每个元素调用一次传递的回调函数,直到它返回 true。如果找到这样的元素,findIndex 方法将立即返回该元素的索引。
forEach 回调方法接受三个参数“元素、索引、数组”
您可以立即检查下一个字符是否匹配。