深刻了解到数组的reduce方法
题目
给定字符串'strhvcvgjfdcvvvsxsy'
统计各个字符出现的频率
拿到自己解法是:
let str = 'strhvcvgjfdcvvvsxsy'
const obj = {}
str.split('').forEach((item) => {
if (obj[item]) {
obj[item] += 1
} else {
obj[item] = 1
}
})
let newArr = []
for (key in obj) {
const newObj = {}
newObj[key] = obj[key]
newArr.push(newObj)
}
newArr.sort((a, b) => {
return b[Object.keys(b)] - a[Object.keys(a)]
})
const count = {}
newArr.forEach((item) => {
count[Object.keys(item)] = item[Object.keys(item)]
})
console.log(count)
学习到的方法:用reduce
// 统计出现频率
const result = str.split('').reduce((a, b) => {
if (a[b]) {
a[b]++
} else {
a[b] = 1
}
return a
}, {})
简化
使用 || 或逻辑,还有return的()括号函数
return (xxx, xxxx, xxxxx, aaaa)
括号内不管有多少,都只返回最后一位aaaa
const result2 = str.split('').reduce((a, b) => (a[b]++ || (a[b] = 1), a), {})
const arr = Object.entries(result2).sort((a, b) => a[1] - b[1]).reduce((a, b) => ((a[b[0]] = b[1]), a), {})
重点:reduce方法
reduce((pre, cur, index) => {}, n) n为初始值,默认为0
一般常用于数组求和
过程就是
- 参数a先为初始值0, b为数组的第一个值 , 一轮过后为 0 + 1 = 1
- 第二轮a为上一轮的结果1, b为数组的第二个值,则为1 + 5 = 6
const a = [1, 5]
const num = a.reduce((a, b) => a + b, 0)
console.log(num)
总结
即初始值设为{}时,a就是{},a[b] = 1 ===> {s: 1}