使用.replace()编写移除字符串指定位置多字符的函数失效如何解决?
问题描述
该函数设计目标是接收3个输入参数,完成字符串指定范围的字符移除:
str:待处理的原始字符串index:移除操作的起始位置索引count:从起始位置开始需要移除的字符总数量
原有错误实现代码如下,运行后最多只能移除1个字符,无法满足需求:
function removeFromString(str, index, count) { let newStr = ''; for (let i = index; i <= (index + count); i++) { newStr = str.replace(str[i], ''); } return newStr; }
错误原因
- 循环逻辑错误:每次循环都直接对原始字符串
str调用replace方法,没有基于上一轮修改后的字符串做操作,每次都会覆盖newStr的值,最终返回的只是最后一轮单次替换的结果 - 循环边界错误:终止条件写为
i <= (index + count)会多遍历1个位置,要移除count个字符不需要覆盖到index+count的索引位 - 替换逻辑隐患:
String.replace传入字符串参数时只会替换第一个匹配项,如果字符串前面有和待移除位置相同的字符,会出现移除位置错误的问题
正确实现
不需要写循环,直接用字符串切片拼接是最简洁高效的方案:
function removeFromString(str, index, count) { // 拼接起始位置前的片段、跳过count个字符后的剩余片段 return str.slice(0, index) + str.slice(index + count); }
如果要沿用循环实现的思路,修正后的代码如下:
function removeFromString(str, index, count) { let newStr = str; // 循环执行count次,每次移除当前index位置的1个字符 for (let i = 0; i < count; i++) { newStr = newStr.slice(0, index) + newStr.slice(index + 1); } return newStr; }
效果验证
// 从"hello world"索引2位置开始移除3个字符 removeFromString("hello world", 2, 3) // 返回 "he world" // 从"abcdefg"索引0位置开始移除5个字符 removeFromString("abcdefg", 0, 5) // 返回 "fg" // 从"javascript"索引3位置开始移除2个字符 removeFromString("javascript", 3, 2) // 返回 "javscript"
内容的提问来源于stack exchange,提问作者airuhm
相关产品推荐
相关产品推荐

