有这么一个字符串 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), {});
};