定义
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。对空数组是不会执行回调函数的。
语法
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
参数
var arr = [2,4,6,7,3];// 前面两个是必须, 0表示传递给函数的初始值arr.reduce((total, currentValue, currentIndex, arr) => { // 这里total指初始值, 或者计算结束后的返回值, console.log(total); // 0 console.log(currentValue); // 2 console.log(currentIndex); // 0 console.log(arr); // [2,4,6,7,3]}, 0)
几种常见用法
1、计算数组总数
var res = arr.reduce((total,num) => { return total + num; }) console.log(res) // 22
2、合并二维数组
var red = [[0,1],[2,3],[4,5]].reduce((a,b) => { return a.concat(b) },[]) console.log(red) // [0, 1, 2, 3, 4, 5]
3、统计一个数组中有多少个不重复的单词
function getWordCnt1() { return reg.reduce((prev, next) => { prev[next] = (prev[next] + 1) || 1; return prev; }, {})}console.log(getWordCnt1()) // {apple: 2, orange: 3, pear: 1}
4、去重
var reh = [2,4,5,3,2,4,1]function distinct(reh) { return reh.reduce((prev, cur) => { return prev.indexOf(cur) != -1? prev : [...prev, cur] },[])}console.log(distinct(reh)) // [2,4,5,3,1]
扩展
前几天刷脉脉,看到一个面试题,要求把数组里name相等的去重,并且menu求重复的总和
var 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},]
如果用reduce做也是非常简单,直接上代码
let reg= Object.entries(arr.reduce((result,obj) => { result[obj.name] = (result[obj.name] + obj.menu) || obj.menu return result; }, {})).map(obj => { return { name: obj[0], menu: obj[1] } })console.log(reg) // [{name: "a", menu: 23}, {name: "g", menu: 8}, {name: "c", menu: 48}]
总结
reduce(callback,initiaValue)会传入两个变量,回调函数(callback)和初始值(initiaValue) 如果没有传入初始值,则 reduce 方法会对从第二个元素开始的每个元素调用callback函数 如果提供了初始值(initiaValue),则 reduce 方法会对数组中的每个元素调用一次callback函数