JavaScript实现筛选含指定字符的单词列表问题排查与解决
解决JavaScript中筛选包含指定任意字符的单词问题
你的filterWords函数逻辑存在问题:循环里每次调用filter都会直接覆盖output变量,最终只会保留最后一个字符筛选出的结果。比如示例中,最后一次循环用字符'e'过滤,得到['the','bone'],漏掉了包含'a'的单词'a'。
正确实现方式
这里提供三种可行的解决方案:
方法一:利用Set提升查询效率
function filterWords(words, letters) { const letterSet = new Set(letters); return words.filter(word => { for (const char of word) { if (letterSet.has(char)) { return true; } } return false; }); }
思路:将目标字符转为Set,利用Set的has方法更快的查询速度,遍历每个单词的字符,只要存在任意一个目标字符就保留该单词。
方法二:使用数组some方法简化代码
function filterWords(words, letters) { return words.filter(word => [...word].some(char => letters.includes(char))); }
思路:把单词拆分为字符数组,用some方法判断是否存在任意一个字符在目标字符列表中,some只要有一个条件满足就返回true,正好匹配“包含任意一个或多个指定字符”的需求。
方法三:正则表达式实现
function filterWords(words, letters) { const regex = new RegExp(`[${letters}]`); return words.filter(word => regex.test(word)); }
思路:通过构造包含目标字符集的正则表达式,用test方法快速判断单词是否匹配(即包含任意指定字符),代码最为简洁。
测试示例
const words = ['the','dog','got','a','bone']; const letters = 'ae'; console.log(filterWords(words, letters)); // 输出: ['the','a','bone']
原代码错误原因回顾
原代码的循环逻辑是每次对整个words数组重新过滤,并用新结果覆盖output。比如示例中:
- 第一次循环用'a'过滤,得到
['a'],赋值给output - 第二次循环用'e'过滤,得到
['the','bone'],覆盖掉之前的output
最终返回的是第二次的结果,自然漏掉了符合第一个字符条件的单词。
内容的提问来源于stack exchange,提问作者asdasd asdasd
相关产品推荐
相关产品推荐

