将字符串例如:
str = “abcddcbaAABBC”
中每个字符统计,数据结果为使用对象形式表示。
即:
{ a:2,b:2,c:2,d:2,A:2,B:2,C:1 }
1. 首先将字符串转换成数组
通过
Array.from()
方法从一个类似数组或可迭代对象创建一个新的、浅拷贝的数组实例,返回值为新的数组。
Array.from(str)
2.1 创建空对象,通过遍历数组判断字符
在对象内判断是否有数组中的元素(字符) Object.hasOwnProperty()
Object.hasOwnProperty()
方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
const obj = {a:1}; obj.hasOwnProperty("a");
返回是true
2.1 实现
const str = "abcddcbaAABBC"
const arr = Array.from(str)
var obj = {}
for(i in arr){
if(obj.hasOwnProperty(arr[i])){
obj[arr[i]] = obj[arr[i]] + 1
}else{
obj[arr[i]] = 1
console.log(obj)
{ a: 2, b: 2, c: 2, d: 2, A: 2, B: 2, C: 1 }
2.2 使用 Array.reduce() 对数组内的每个元素进行统计
reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
语法:Array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
[1,2,3,4,5].reduce((calc,curr)=>[...calc,curr],[])
输出结果为:[1,2,3,4,5]
[...calc,curr]
将curr
当前元素放入calc
数组中
[1,2,3,4,5].reduce((calc,curr)=>calc+=curr,'')
输出结果为:"12345"
calc+=curr
将curr
当前元素拼接到 calc
中
[1,2,3,4,5].reduce((calc, curr)=>{ return{ [curr]:1 } } , {})
输出结果为:{ 5:1 }
[curr]
可获取当前curr
元素
Tips:~(取反)
对于undefined
,null
,NaN
,0
等取反都是-1
且对于1, 2
取反,~1
为-2(二进制即~01 为 10 ,且正数取反为负数)
,~2
为-3
所以可以根据这个取反且加负数的方式来获取增值.
2.2 实现
var obj = arr.reduce((calc, curr)=> {
return {
...calc,
[curr]:-~calc[curr]
},{})
console.log(obj)
{ a: 2, b: 2, c: 2, d: 2, A: 2, B: 2, C: 1 }
2.3 由于涉及到对象{} 使用 对象变量 in 数组/对象 判断
所以上面两种方法可以改写成如下:
var obj = {}
for (i in arr) {
if (obj[arr[i]] in arr) {
obj[arr[i]] = obj[arr[i]] + 1
} else {
obj[arr[i]] = 1
console.log(obj)
var obj = arr.reduce((calc, curr)=> {
if(curr in calc){
calc[curr]++
}else{
calc[curr] = 1
return calc
},{})
console.log(obj)
先将字符串通过Array.from()
转换成数组
使用Object.hasOwnProperty()
来判断空对象中是否含有数组中元素
将数组通过累加器Array.reduce()
进行累加,累加的结果通过对象形式呈现,对象中的 key
是数组的元素值,每次遍历到当前数组元素时,对当前对象中的key
进行赋值,值为 -~value
,且通过累加器放在一个 calc
对象中,最后返回累加值calc
对象。
如果返回一个对象,需要特别注意,如果是单表达式要返回自定义对象,不写括号会报错,因为和函数体的{ ... }
有语法冲突。