使用Map方法反转奇数长度元素时丢失'T'字符的问题
问题分析与解决:反转奇数长度字符串元素时的字符重复问题
你的代码在处理包含重复字符的奇数长度字符串(比如"Three")时出错,核心原因是使用el.indexOf(el1)获取字符索引——该方法只会返回第一个匹配字符的索引,导致重复字符无法正确映射到反转后的位置。
以"Three"为例:原字符串字符索引为T(0)、h(1)、r(2)、e(3)、e(4),当遍历到第二个'e'时,el.indexOf('e')仍返回3,计算出的目标索引为5-3-1=1,对应原字符串的'h',最终错误生成['e','e','r','h','h'],而正确的反转结果应该是['e','e','r','h','T']。
修正后的代码
let name = "One Two Three Four"; let newMap = name.split(" ").map(el => { const chars = el.split(""); if (el.length % 2 !== 0) { // 利用map的索引参数i,直接计算反转后的对应位置 return chars.map((_, i) => chars[chars.length - 1 - i]); } else { // 偶数长度直接返回原字符数组,无需额外映射 return chars; } }); console.log(newMap); // 输出:[ ['e','n','O'], ['o','w','T'], ['e','e','r','h','T'], ['F','o','u','r'] ]
关键优化点
- 用
chars变量存储拆分后的字符数组,避免重复调用split方法 - 反转逻辑依赖
map的第二个参数i(当前元素的索引),通过chars.length - 1 - i直接定位反转后的字符,彻底规避indexOf的重复字符问题 - 简化偶数长度字符串的处理逻辑,直接返回原数组即可
如果需要将结果转回字符串数组,可追加一步处理:
let result = newMap.map(arr => arr.join("")); console.log(result); // 输出:[ 'enO', 'owT', 'eerhT', 'Four' ]
内容的提问来源于stack exchange,提问作者Hareesh
相关产品推荐
相关产品推荐

