JavaScript如何在数组中筛选含指定频次目标字符的字符串
问题根因定位
你现有代码无法输出预期结果,核心存在两个问题:
Array.filter()的回调函数必须返回布尔值决定元素去留,你当前的回调只执行了includes判断但没有写return语句,默认返回undefined(假值),最终所有元素都会被过滤,得到空数组includes('a')仅能判断字符串中是否存在a字符,完全没有统计字符出现频次的能力,无法满足“按指定出现次数筛选”的需求
正确实现思路
要实现按字符出现频次筛选,核心逻辑分为三步:
- 统一将字符串转小写/大写,避免大小写差异导致的计数偏差(比如字符串开头的大写A不会被漏算)
- 对每个字符串里的目标字符做计数,得到准确的出现次数
- 对比计数结果和你指定的目标频次,符合条件的条目才会被保留
可直接运行的实现代码
下面提供两种常见实现方式,替换原有代码即可:
简洁正则实现
const fruits = ['Apple', 'Apricots', 'Banana', 'Watermelon', 'Strawberry', 'Peech']; // 可根据需求调整目标字符、目标出现次数 const targetChar = 'a'; const targetTimes = 3; // 注意:banana逐字符计数实际包含3个a,若设为2将输出空数组 const filteredFruits = fruits.filter(fruit => { // 全局匹配目标字符,匹配不到时返回空数组兜底,避免null取值报错 const matchResult = fruit.toLowerCase().match(new RegExp(targetChar, 'g')) || []; return matchResult.length === targetTimes; }); console.log(filteredFruits); // 输出 ['Banana']
易读手动计数实现
如果不想使用正则,可以用循环逐字符计数,逻辑更直观:
const fruits = ['Apple', 'Apricots', 'Banana', 'Watermelon', 'Strawberry', 'Peech']; const targetTimes = 3; const filteredFruits = fruits.filter(fruit => { const lowerStr = fruit.toLowerCase(); let count = 0; for (const char of lowerStr) { if (char === 'a') count++; } return count === targetTimes; }); console.log(filteredFruits); // 输出 ['Banana']
小提示:当目标字符串里一次目标字符都没有时,正则的
match方法会返回null,此时直接取length会触发运行错误,代码里加|| []做兜底是非常必要的。
内容的提问来源于stack exchange,提问作者fahad javed
相关产品推荐
相关产品推荐

