Array.reduce( Function, initValue )
两个参数都非常的重要(虽然第二个可有可无)
- Function: 不用说,肯定是个回调函数。由开发者提供 reduce 来回调
- initValue: 第一次回调 Function 时会将 initValue 传入到 Function 的第一个参数中 function(pre, cur, index, arr)
pre: 上一次的结果集,这个值通常会使用 initValue 作为第一次的默认参数,不过,我上面也有提到,当 initValue 没有传入参数时这个值将会是 数组 的第一个值
cur: 当前元素,与我们使用 forEach/map 时的 item 一样。都是当前循环到的那个对象
index: 当前元素的索引
arr: 当前元素所属的数组
- 循环累加
入参:[1,2,3,4,5]
出参:15
let arr1 = [1, 2, 3, 4, 5]var result = arr1.reduce((pre, cur) => pre + cur)console.log(result) // 15
- 处理二维数组扁平化
要点:concat合并数组
入参:[[1,2,3],[4,5,6],[7,8,9]]
出参:[1, 2, 3, 4, 5, 6, 7, 8, 9]
let arr2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]var result = arr2.reduce((pre, cur) => {return pre.concat(cur)}, [])console.log(result) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
- 处理多维数组扁平化
要点:递归,判断是否是数组 进行递归 合并数组
入参:[[1,[2,3]],[[4,5,[6,[]]],[7,[8],9]]]
出参:[1, 2, 3, 4, 5,6, 7, 8, 9]
其他:arr3.flat(Infinity),递归循环
let arr3 = [[1, [2, 3]], [[4, 5, [6, []]], [7, [8], 9]]]
const fn = (arr) => {return arr.reduce((pre, cur) => {return pre.concat(Array.isArray(cur) ? fn(cur) : cur)
}, [])}console.log(fn(arr3))// [1, 2, 3, 4, 5,6, 7, 8, 9]
- 数组去重
要点 indexOf,找到就不等于 -1 就为true,没有找到就== -1 就为 false ,走下面的push
入参:[1, 2, 3, 45, 6, 12, 3, 4, 12, 3, 1, 3, 2]
出参:[1, 2, 3, 45,6, 12, 4]
let arr4 = [1, 2, 3, 45, 6, 12, 3, 4, 12, 3, 1, 3, 2]var result = arr4.reduce((pre, cur) => {// !pre.includes(cur) && pre.push(cur)pre.indexOf(cur) !== -1 || pre.push(cur)return pre}, [])console.log(result) // [1, 2, 3, 45,6, 12, 4]
- 取出数组中 最大值,最小值
入参:[1, 2, 3, 45, 6, 12, 3, 4, 12, 3, 1, 3, 2]
出参:最大值:45,最小值:1
let arr5 = [1, 2, 3, 45, 6, 12, 3, 4, 12, 3, 1, 3, 2]var resultMax = arr5.reduce((pre, cur) => {return pre > cur ? pre : cur})console.log(resultMax) // 45
var resultMin = arr5.reduce((pre, cur) => {return pre < cur ? pre : cur})console.log(resultMin) // 1
- 得到下面数字每次出现的次数
要点:利用对象的key 去重,给value加加
value = 第一进来 pre[cur]对象没key就为空 就会默认是 0 ,如果pre[cur]有key 就会取到key对应的value
入参:[1, 2, 3, 45, 6, 12, 3, 4, 12, 3, 1, 3, 2] * 出参:{ '1': 2, '2': 2, '3': 4, '4': 1, '6': 1, '12': 2, '45': 1 }
let arr6 = [1, 2, 3, 45, 6, 12, 3, 4, 12, 3, 1, 3, 2]var result = arr6.reduce((pre, cur) => {let value = pre[cur] || 0pre[cur] = ++valuereturn pre}, {})console.log(result)
- 数组,根据name去重
入参:[{name: '小杜'},{name: '小杜'},{name: '李四'},{name: '王五'},{name: '王五'},{name: '小青'},{name: '小青'},{name: '桃子'},{name: '小刘'}];
出参:[{ name: '小杜' }, { name: '李四' }, { name: '王五' }, { name: '小青' }, { name: '桃子' }, { name: '小刘' }]
let arr7 = [{name: '小杜'},
{name: '小杜'},{name: '李四'},{name: '王五'},{name: '王五'},{name: '小青'},{name: '小青'},{name: '桃子'},
{name: '小刘'}];
var result = arr7.reduce((pre, cur) => {pre.includes(cur.name) || pre.push(cur.name)
return pre}, [])console.log(result) // [ '小杜', '李四', '王五', '小青', '桃子', '小刘' ]
var result = arr7.reduce((pre, cur) => {if (!pre.names.includes(cur.name)) {
pre.names.push(cur.name)pre.unique.push(cur)}return pre}, {names: [], unique: []})
console.log(result)
// {names: [ '小杜', '李四', '王五', '小青', '桃子', '小刘' ],// unique: [{ name: '小杜' }, { name: '李四' }, { name: '王五' }, { name: '小青' }, { name: '桃子' }, { name: '小刘' }]}
- 对数组根据名称首字母分类
入参:[{ name: 'Bob' },{ name: 'Ben' },{ name: 'Cole' },{ name: 'Mary' },{ name: 'Travis' }]
出参:{ B: [ 'Bob', 'Ben' ], C: [ 'Cole' ], M: [ 'Mary' ], T: [ 'Travis' ] }
let arr8 = [{name: 'Bob'},{name: 'Ben'},{name: 'Cole'},{name: 'Mary'},{name: 'Travis'}]
var result = arr8.reduce((pre, cur) => {
let n = cur.name[0]
// 如果 pre 为空就要赋值 一个数组,方便插入下一个nameif(!pre[n]) pre[n] = []pre[n].push(cur.name)return pre}, {})console.log(result) // { B: [ 'Bob', 'Ben' ], C: [ 'Cole' ], M: [ 'Mary' ], T: [ 'Travis' ] }
发表评论