如何改写lettersAfter函数,避免匹配多个字符后循环持续执行?
修复
lettersAfter()函数的匹配后循环终止问题 我们需要实现一个lettersAfter()函数,参数说明:
haystack:待搜索的目标字符串needle:要查找的单个字符limit:需返回的匹配字符后续字符数量
函数要求:找到第一个匹配的字符后,返回它后面的limit个字符(若剩余字符不足limit则返回所有剩余字符)。示例:lettersAfter('hello', 'e', 2)应返回'll'。
问题现象
运行lettersAfter('Bobthebuilder', 'b', 5)时,预期返回'thebu',但实际返回了'thebuuilde'。
问题根源
原代码的外层循环在找到第一个匹配字符后没有终止,会继续遍历后续字符,导致多次执行截取逻辑并追加结果,最终返回了多余的字符。
修复方案
方案1:循环内找到匹配后终止循环
function lettersAfter(haystack, needle, limit) { let result = ''; for (let i = 0; i < haystack.length; i++) { if (haystack[i] === needle) { const startPos = i + 1; // 截取从匹配位置后一位开始的limit个字符,自动处理超出字符串长度的情况 result = haystack.slice(startPos, startPos + limit); // 找到第一个匹配后立即终止外层循环 break; } } return result; }
方案2:利用indexOf简化逻辑
直接用indexOf定位第一个匹配的索引,更简洁高效:
function lettersAfter(haystack, needle, limit) { const matchPos = haystack.indexOf(needle); // 没有找到匹配字符时返回空字符串 if (matchPos === -1) return ''; const start = matchPos + 1; return haystack.slice(start, start + limit); }
测试验证
lettersAfter('Bobthebuilder', 'b', 5)→ 返回'thebu'(符合预期)lettersAfter('hello', 'e', 2)→ 返回'll'(符合要求)lettersAfter('test', 'x', 3)→ 返回''(无匹配时返回空)
内容的提问来源于stack exchange,提问作者Chase Burleson
相关产品推荐
相关产品推荐

