JavaScript获取两个字母中间字母的函数返回错误结果,请求排查
问题分析与修复
你的函数核心问题在于**slice方法的第二个参数未包含目标字母**,以及范围计算时的边界错误:
具体问题点
slice的截断范围错误:Array.slice(start, end)的end参数是排他的,也就是说它只会截取到end-1索引的元素。你的代码里用alphabetArr.indexOf(lastLetter)作为end,导致最终的alphabetRange没有包含lastLetter,直接导致后续中间字母计算全部偏移。- 比如调用
findMiddleAlphabet('Q', 'U')时,Q的索引是16,U是20,slice(16,20)得到的是['Q','R','S','T'],漏掉了U; - 调用
findMiddleAlphabet('R', 'U')时,slice(17,20)得到['R','S','T'],漏掉了U。
- 比如调用
边界情况处理缺失(可选优化):如果传入的
firstLetter索引大于lastLetter(比如传'U'和'Q'),slice会返回空数组,直接返回空字符串,这不符合常规需求,最好先统一索引的顺序。
修复后的代码
const findMiddleAlphabet = (firstLetter, lastLetter) => { const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const startIdx = alphabet.indexOf(firstLetter); const endIdx = alphabet.indexOf(lastLetter); // 处理字母顺序颠倒的情况,确保start <= end const minIdx = Math.min(startIdx, endIdx); const maxIdx = Math.max(startIdx, endIdx); // 修正slice的end参数,+1以包含最后一个字母 const alphabetRange = [...alphabet].slice(minIdx, maxIdx + 1); if (!alphabetRange.length) return ''; const mid = alphabetRange.length / 2; if (alphabetRange.length % 2 === 1) { // 奇数长度,返回正中间的字母 return alphabetRange[Math.floor(mid)]; } else { // 偶数长度,返回中间两个字母 return alphabetRange[mid - 1] + alphabetRange[mid]; } } console.log(findMiddleAlphabet('Q', 'U')); // 输出: S console.log(findMiddleAlphabet('R', 'U')); // 输出: ST console.log(findMiddleAlphabet('U', 'Q')); // 额外测试: S
验证结果
- 调用
findMiddleAlphabet('Q', 'U'):范围是['Q','R','S','T','U'],长度5,中间索引2,对应字母S,符合预期; - 调用
findMiddleAlphabet('R', 'U'):范围是['R','S','T','U'],长度4,中间两个索引1和2,对应字母S和T,拼接后为ST,符合预期。
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

