一、reduce
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce(callback,initiaValue)会传入两个变量,回调函数(callback)和初始值(initiaValue)
如果没有传入初始值,则 reduce 方法会对从第二个元素开始的每个元素调用callback函数
如果提供了初始值(initiaValue),则 reduce 方法会对数组中的每个元素调用一次callback函数
注意: reduce() 对于空数组是不会执行回调函数的。
语法
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
var arr = [1,2,3,4,5,6];
// 前面两个是必须, 0表示传递给函数的初始值
arr.reduce((total, currentValue, currentIndex, arr) => {
// 这里total指初始值, 或者计算结束后的返回值,
console.log(total); // 0
console.log(currentValue); // 1
console.log(currentIndex); // 0
console.log(arr); // [1,2,3,4,5,6]
}, 0)
1 计算数组总数
let arr = [1, 2, 3, 4, 5, 6]
let res = arr.reduce((total, currentValue) => {
return total + currentValue
}, 0)
console.log(res);//21
2 合并二维数组
let arr = [[1, 2], [2, 3], [4, 5], [6, 7]]
let res = arr.reduce((a, b) => {
return a.concat(b)
}, [])
console.log(res)//[1,2,2,3,4,5,6,7]
3 统计一个数组中有多少个不重复的单词
practice = () => {
let reg = ['B', 'A', 'A', 'B', 'C', 'B', 'G']
reg.sort()//会改变原数组
return reg.reduce((a, b) => {
a[b] = (a[b] + 1) || 1;
return a;
}, {})
}
console.log(practice)//{A: 2, B: 3, C: 1, G: 1}
4. 数组去重
practice = () => {
let reg = [1,1,2,2,22,4,4,6,6,8]
return reg.reduce((a, b) => {
return a.includes(b)?a:a.concat(b)
//return a.includes(b)?a:[...a,b]
}, [])
}
// console.log(practice)[1, 2, 22, 4, 6, 8]
面试题:把数组里name相等的去重,并且menu求重复的总和
practice = () => {
let arr = [
{name: 'a', menu: 2},
{name: 'a', menu: 21},
{name: 'g', menu: 2},
{name: 'g', menu: 3},
{name: 'g', menu: 3},
{name: 'c', menu: 4},
{name: 'c', menu: 44},
]
//Object.entries() 可以把一个对象的键值以数组的形式遍历出来
return Object.entries(arr.reduce((a, b) => {
a[b.name] = (a[b.name] + b.menu) || b.menu
return a
}, {}))//[["a", 23],["g", 8],["c", 48]]
.map(item => {
return {
name: item[0],
menu: item[1]
}
})
}
console.log(this.practice());//[{name: "a", menu: 23}, {name: "g", menu: 8}, {name: "c", menu: 48}]