JS统计字符串出现频率

统计字符串中每个字符出现的频率可以通过几种不同的方法实现。以下是几种常见的方法:

统计字符串中每个字符出现的频率可以通过几种不同的方法实现。以下是几种常见的方法:

1. 使用对象 (Object)

javascriptfunction CountCharacterTimes(str) {
  // 创建一个空对象,用来存储每个字符及其出现的次数
  const freqMap = {};
  // 遍历输入字符串中的每个字符
  for (const char of str) {
    // 如果 freqMap 中还没有这个字符,则初始化为 0
    // 然后,将当前字符的计数加 1
    // 使用 || 运算符来处理第一次遇到的字符
    freqMap[char] = (freqMap[char] || 0) + 1;
  }
  return freqMap;
}

2. 使用 Map 对象

javascriptfunction CountCharacterTimes(str) {
  // 创建一个新的 Map 对象,用来存储每个字符及其出现的次数
  const freqMap = new Map();
  // 遍历输入字符串中的每个字符
  for (const char of str) {
    // set 方法用于设置一个键值对, 使用 set 方法设置字符的计数值
    // 用于获取键 char 对应的值. 如果字符不在 Map 中,get 方法将返回 undefined,|| 运算符确保默认值为 0
    // 然后将字符的计数加 1
    freqMap.set(char, (freqMap.get(char) || 0) + 1);
  }
  // 将 Map 对象转换回普通对象(JSON 对象)以便返回
  // 使用 Object.fromEntries 将 Map 中的键值对转换为对象
  return Object.fromEntries(freqMap);
}

3. 使用数组和索引

如果只处理 ASCII 字符,可以创建一个大小为 128 的数组(基于扩展 ASCII),数组的索引对应字符的 ASCII 码。

javascriptfunction CountCharacterTimes(str) {
  // 创建一个长度为 128 的数组,用以存储每个 ASCII 字符的出现次数,
  // 并用 fill 方法将所有元素初始化为 0。
  // 这里假设字符都是标准的 ASCII 字符  
  const freqArray = new Array(128).fill(0);
  // 遍历字符串中的每个字符
  for (const char of str) {
    // 使用 charCodeAt(0) 获取字符的 ASCII 码,
    // 然后将对应索引的计数加 1
    freqArray[char.charCodeAt(0)] += 1;
  }
  
  // 使用数组的 reduce 方法将统计数组转换为一个对象。
  // 对于 reduce 方法的回调函数:
  // - acc 是累加器,用于累积结果,初始值为一个空对象 {}
  // - count 是当前遍历到的元素的值(字符出现的次数)
  // - index 是当前遍历到的元素的索引(字符的 ASCII 码)
  // 如果 count 大于 0,说明字符至少出现了一次,
  // 则将该字符(通过 String.fromCharCode(index) 转换索引为字符)及其计数添加到累加器对象中
  return freqArray.reduce((acc, count, index) => {
    if (count > 0) acc[String.fromCharCode(index)] = count;
    return acc;
  }, {});
}

4. 使用 JavaScript 的内置函数 reduce

javascriptfunction CountCharacterTimes(str) {
  // 使用 str.split('') 将字符串转换为字符数组
  // 然后使用 reduce 方法遍历数组,累加每个字符出现的次数
  return str.split('').reduce((acc, char) => {
    // acc 是累加器,用于累积结果,初始值为一个空对象 {}
    // char 是当前遍历到的字符

    // 对于每个字符,如果它已经在累加器对象中,则其计数加 1
    // 如果不在,则设置为 1
    // 使用 || 运算符来处理字符第一次出现的情况
    acc[char] = (acc[char] || 0) + 1;
    
    // 返回更新后的累加器对象
    return acc;
  }, {}); // 第二个参数 {} 表示 reduce 的初始值是一个空对象
}

5. 使用正则表达式和 match 方法

这个方法适用于统计所有不重复的字符。

javascriptfunction CountCharacterTimes(str) {
  const matches = str.match(/[\s\S]/g); // 匹配所有字符,包括空白字符
  // \s 匹配任何空白字符
  // \S 匹配任何非空白字符
  // g 标志表示全局搜索,匹配所有可能的字符
  if (!matches) return {};  // 如果 matches 为 null(即没有找到匹配的字符),则返回一个空对象
  // 使用 reduce 方法遍历 matches 数组
  // 累加器 acc 初始为空对象 {}
  // 对于数组中的每个字符 char,如果它已经在 acc 中,则其计数加 1;如果不存在,则设置为 1
  // 然后返回更新后的 acc 对象
  return matches.reduce((acc, char) => {
    acc[char] = (acc[char] || 0) + 1;
    return acc;
  }, {});
}

注意事项:

  • 如果字符串中包含特殊字符或非 ASCII 字符,方法 3 可能需要调整数组大小或使用不同的数据结构。
  • 方法 5 使用正则表达式 \s\S 来匹配所有字符,包括空白字符。如果只需要统计非空白字符,可以替换为 \S。
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值