reduce详解
- const val=arr.reduce((t,v)=>{return t+v},c)
- 以t作为累计结果的初始值,不设置t则以数组第一个元素为初始值
- 开始遍历,使用累计器处理v,将v的映射结果累计到t上,结束此次循环,返回
- c初始值
- 另外reduce还有一个胞弟reduceRight,两个方法的功能其实是一样的,只不过reduce是升序执行, reduceRight是降序执行。
对空数组调用reduce()和reduceRight()是不会执行其回调函数的,可认为reduce()对空数组无效
reduce用法
function Accumulation (...arr) {
return arr.reduce((t, v) => t + v, 0)
}
console.log(Accumulation(1, 2, 3, 4, 5, 6, 7))
function reverseEv (arr = []) {
return arr.reduceRight((t, v) => [...t, v], [])
}
console.log(reverseEv([1, 2, 3, 4, 5]))
function mapFilterEv () {
const arr = [1, 2, 3, 4, 5]
const mapArr = arr.reduce((t, v) => [...t, v * 2], [])
console.log(mapArr)
const filterArr = arr.reduce((t, v) => v > 3 ? [...t, v] : t, [])
console.log(filterArr)
}
mapFilterEv()
function someEveryEv () {
const scores = [
{ score: 45, subject: 'chinese' },
{ score: 90, subject: 'math' },
{ score: 60, subject: 'english' }
]
const someScores = scores.reduce((t, v) => t || v.score >= 60, false)
console.log(someScores)
const every = scores.reduce((t, v) => t && v.score >= 60, true)
console.log(every)
}
someEveryEv()
function chunkEv (arr = [], size = 1) {
return arr.length
? arr.reduce((t, v) => (t[t.length - 1].length === size ? t.push([v]) : t[t.length - 1].push(v), t), [[]])
: []
}
console.log(chunkEv([1, 2, 3, 4, 5], 2))
function differenceEv (arr1 = [], arr2 = []) {
return arr1.reduce((t, v) => (arr2.includes(v) ? t : t.push(v), t), [])
}
console.log(differenceEv([1, 2, 3, 4, 5], [1, 3, 6]))
function uniqEv (arr) {
return arr.reduce((t, v) => t.includes(v) ? t : [...t, v], [])
}
console.log(uniqEv([2, 1, 5, 4, 1, 24, 5, 4, 2, 5, 6, 8, 1]))
function maxEv (arr) {
return arr.reduce((t, v) => t < v ? v : t)
}
function minEv (arr) {
return arr.reduce((t, v) => t > v ? v : t)
}
console.log(maxEv([25, 65, 19, 25, 68, 35, 34, 98, 72, 32]))
console.log(minEv([25, 65, 19, 25, 68, 35, 34, 98, 72, 32]))
function countEv (arr) {
return arr.reduce((t, v) => {
const obj = (t[v] = (t[v] || 0) + 1, t)
return obj
}, {})
}
console.log(countEv([0, 1, 1, 2, 2, 2]))