技巧-统计字符串中某个字符出现的频率

134 阅读1分钟

有这么一个字符串 gagglajgeogqpgghuueugjjageihgjglpg,其中每个字符出现了一次或多次,现在需要把每个字符串出现的次数算出来。

写一个方法,统计出字符串中每个字符出现的次数。

1. 传统写法

/**
 * @description: 传入一个字符串,统一每个字符出现的次数
 * @param {string} str 需要处理的字符串
 * @return {object} 各个字符出现的次数
 */
export const statisticalCharacters = (str) => {
  const result = {};
  for (const c of str) {
    if (result[c]) {
      result[c]++;
    } else {
      result[c] = 1;
    }
  }
  return result;
};

2. 炫技写法

/**
 * @description: 传入一个字符串,统一每个字符出现的次数
 * @param {string} str 需要处理的字符串
 * @return {object} 各个字符出现的次数
 */
export const statisticalCharacters = (str) => {
// str='aghjljgajaghoageoq'
// 当开始遍历的时候,就把`{}`传递给参数`c`,第一个字符`a`传递给`c`
// r:{} c:a
  const result = [...str].reduce((r, c) => {
    if (r[c]) {
      r[c]++;
    } else {
      r[c] = 1;
    }
    return r;
  }, {});
  return result;
};

代码简化

[c]++ || (r[c] = 1) //如果`r[c]`不存在,++后为 `NaN`,判定为 `false`,则执行后面

([c]++ || (r[c] = 1),r) // `()`运算符,会依次运算里面的参数,并返回最后一个参数

/**
 * @description: 传入一个字符串,统一每个字符出现的次数
 * @param {string} str 需要处理的字符串
 * @return {object} 各个字符出现的次数
 */
export const statisticalCharacters = (str) => {
  return [...str].reduce((r, c) => (r[c]++ || (r[c] = 1), r), {});
};