You need to enable JavaScript to run this app. JavaScript如何在数组中筛选含指定频次目标字符的字符串
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 03:15:04