JavaScript统计指定长度范围单词数:代码返回值异常问题排查
问题排查与解决方案
我来帮你搞定这个问题!你的代码逻辑本身没问题,但分割字符串的方式存在局限性,这就是测试用例会返回0的核心原因。
问题根源
你用str.split(' ')来分割单词,这种方式只能识别单个半角空格作为分隔符。如果输入字符串存在以下情况,分割结果就会完全不符合预期:
- 单词之间是全角空格、Tab制表符或换行符
- 存在多个连续的空格
- 字符串开头/结尾有多余空格(会产生空字符串元素)
比如如果测试字符串里的空格是全角空格,split(' ')根本不会分割字符串,得到的数组只有一个元素(整个句子),它的长度远大于5,自然不会计入统计,最终返回0。
修复后的代码
我们可以用正则表达式来分割字符串,匹配任意空白字符,同时先去除字符串两端的空白,避免产生空字符串元素:
function wordLengthCount(str, min, max) { // 先去除字符串首尾空白,再按任意数量的空白字符分割单词 const words = str.trim().split(/\s+/); let count = 0; for (let i = 0; i < words.length; i++) { // 如果你需要统计「纯单词长度(不含两端标点)」,可以启用下面的代码替换判断条件: // const cleanWord = words[i].replace(/^[^a-zA-Z]+|[^a-zA-Z]+$/g, ''); // if (cleanWord.length >= min && cleanWord.length <= max) { if (words[i].length >= min && words[i].length <= max) { count++; } } return count; }
测试验证
调用wordLengthCount("The weather is so good today", 2, 5)时:
- 分割后的单词数组是
["The", "weather", "is", "so", "good", "today"] - 符合长度2-5的单词:
The(3)、is(2)、so(2)、good(4)、today(5),共5个,返回结果正确。
另外,针对你给出的第一个示例findWordsWithLengthRange("Life is about making an impact, not making an income", 6,8),修复后的代码也能正确返回4,因为making(6)、impact,(7)、making(6)、income(6)这四个单词的长度都在6-8之间。
额外优化(可选)
如果你的需求是统计不含标点的纯单词长度(比如把impact,当成长度6的单词),可以启用代码中注释的部分,用正则去除单词首尾的非字母字符。
内容的提问来源于stack exchange,提问作者Rushaid
相关产品推荐
相关产品推荐

