如何统计字符串数组中每个字符串的重复字符并生成独立对象?
问题分析
你的代码核心问题是复用了同一个统计对象obj,所有字符串的字符计数都累积到了同一个对象中,最后只将这个对象推入数组一次,所以得到的是所有字符串的合并统计结果。要实现每个字符串对应独立的统计对象,需要为每个字符串单独初始化统计容器。
修正实现
基础循环版(修复你的原代码)
let ArrOfStrs = ["aaabbbccc", "dddeeefff", "ggghhhiii", "jkl"]; var repeats = []; for(let i = 0; i < ArrOfStrs.length; i++) { // 关键:为每个字符串创建新的统计对象 var obj = {}; let str = ArrOfStrs[i]; for(let x = 0; x < str.length; x++) { var l = str.charAt(x); obj[l] = obj.hasOwnProperty(l) ? obj[l] + 1 : 1; } repeats.push(obj); } console.log(repeats);
更简洁的ES6+实现
利用map遍历数组生成每个字符串的统计结果,再用reduce完成单字符串的字符计数:
const ArrOfStrs = ["aaabbbccc", "dddeeefff", "ggghhhiii", "jkl"]; const repeats = ArrOfStrs.map(str => [...str].reduce((countObj, char) => { countObj[char] = (countObj[char] || 0) + 1; return countObj; }, {}) ); console.log(repeats);
这段代码的逻辑:
ArrOfStrs.map(str => ...):遍历原数组,为每个字符串生成对应的统计对象[...str]:将字符串拆分为字符数组(也可以用str.split(''))reduce((countObj, char) => ..., {}):以空对象为初始值,累加每个字符的出现次数
输出结果
执行后会得到你期望的输出:
[{a:3,b:3,c:3}, {d:3,e:3,f:3},{g:3,h:3,i:3},{j:1,k:1,l:1}]
内容的提问来源于stack exchange,提问作者vamsi
相关产品推荐
相关产品推荐

