方法一:
1. 使用对象来统计次数,数组元素作为键名,出现的次数作为键值
2. 首先对数组进行去重,写到一个新数组中
3. 新旧数组元素进行比较,如果元素相同,就让对象的该元素属性值+1
相关函数:
- charAt()——根据字符索引号获得该位置的字符
- forEach()——数组遍历
- indexOf()——根据数组元素获取该元素的索引号
- push()——在数组的最后面添加一个元素,括号内为要添加进去的元素
<script>
//准备统计字符出现的次数
var str = 'abfeacmwwxzyyydsmafe';
var arr = [];
//将字符串转换为数组
for(var i = 0; i < str.length; i++){
arr.push(str.charAt(i));
}
//进行数组遍历去重
var newarr = [];
var obj = {};
arr.forEach(function(item){
if(newarr.indexOf(item) == -1){
//将遍历去重以后的新数组放到newarr中
//newarr的作用主要是给对象做键值
newarr.push(item);
//去重以后的字符作为对象的属性,每个字符出现的次数作为属性值
//属性值先初始化为0
obj[item] = 0;
}
})
//循环遍历写入每个字符出现的次数,更新属性值
newarr.forEach(function(item){
arr.forEach(function(item1){
//去重前和去重后的数组每个元素之间进行比较
//如果相等就让对象中这个字符的属性值+1
if(item == item1){
obj[item]++;
}
})
})
console.log(obj)
</script>
方法二:
- 依然是使用对象来保存
- 使用forEach进行数组遍历
var str = "ABFEacMWwXZyYYDSmaFe";
var newstr = str.toLowerCase();
var arr = [];
//将字符串转换为数组
for (var i = 0; i < newstr.length; i++) {
arr.push(newstr.charAt(i));
}
//使用forEach和对象字面量直接写入
var obj = {}
arr.forEach(function(item){
obj[item] = obj[item] ? obj[item]+1 : 1
})
console.log(obj);
方法三:刷算法题刷到一个蛮有意思的答案,记录一下
相关函数:split,reduce
var str = "ABFEacMWwXZyYYDSmaFe";
var newstr = str.toLowerCase();
let result = newstr.split('').reduce((temp,data)=>{
temp[data]=temp[data]?temp[data] + 1: 1;
return temp;
},{}) // reduce的第二个参数是传递给函数的初始值