JS中replace方法修改指定索引字符大小写部分场景失效问题
问题根源
你写的函数没有按指定索引替换字符,核心问题是误用了字符串的replace方法:
replace传入字符串作为匹配参数时,只会替换字符串中第一个匹配到的目标字符,完全不会按你预想的索引位置定位替换目标。
我们拆解你原函数的执行逻辑就能看懂为什么部分用例正常、部分异常:
原函数代码:
const change = (str,y) => (str.toLowerCase().replace(str[y],str[y].toUpperCase()));
执行步骤是:
- 将输入字符串整体转为全小写
- 取出原字符串(转小写之前的原始输入串)索引
y位置的字符作为匹配值 - 在转好的全小写字符串里,找到第一个和匹配值相等的字符,替换为大写版本
- 返回替换后的结果
用例表现差异原因
- 前三个正常用例(
London/Lagos/Germany)属于歪打正着:索引3位置的目标字符,在字符串前3位都没有出现,所以replace找到的第一个匹配项刚好就是索引3的位置,替换结果符合预期。 - 后两个异常用例问题就出在前置位置有相同字符:
- 输入
Dcoder时,索引3位置的字符是d,全小写后的字符串是dcoder,replace第一个匹配到的d是索引0位置的字符,把它替换为大写D,最终输出Dcoder,看起来和原串一样,实际上替换错了位置。 - 输入
Bobby时,索引3位置的字符是b,全小写后的字符串是bobby,replace第一个匹配到的b是索引0位置的字符,把它替换为大写B,最终输出Bobby,同样是替换位置错误。
- 输入
正确实现方案
不要用replace做固定索引的字符替换,直接通过字符串切片拼接或者拆分数组的方式定位索引修改即可:
切片拼接写法(性能更好)
const change = (str, y) => { const lowerStr = str.toLowerCase(); // 拼接索引y前的片段、大写后的y位字符、索引y后的片段 return lowerStr.slice(0, y) + lowerStr[y].toUpperCase() + lowerStr.slice(y + 1); };
数组转换写法(逻辑更直观)
const change = (str, y) => { const charArr = str.toLowerCase().split(''); charArr[y] = charArr[y].toUpperCase(); return charArr.join(''); };
两种写法测试所有用例都能返回预期结果:
change('London',3)→lonDonchange('Lagos',3)→lagOschange('Germany',3)→gerManychange('Dcoder',3)→dcoDerchange('Bobby',3)→bobBy
内容的提问来源于stack exchange,提问作者Khalifah
相关产品推荐
相关产品推荐

