【dbsgw】js的reduce用法

78 阅读3分钟

Array.reduce( Function, initValue )
两个参数都非常的重要(虽然第二个可有可无)

  1. Function: 不用说,肯定是个回调函数。由开发者提供 reduce 来回调
  2. 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 = [12345]
 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 = [[123], [456], [789]]
 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, [23]], [[45, [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 = [1234561234123132]
 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 = [1234561234123132]
 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 = [1234561234123132]
 var result = arr6.reduce((pre, cur) => {
     let value = pre[cur] || 0
     pre[cur] = ++value
     return 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 为空就要赋值 一个数组,方便插入下一个name
     if(!pre[n]) pre[n] = []
     pre[n].push(cur.name)
     return pre
 }, {})

 console.log(result) // { B: [ 'Bob', 'Ben' ], C: [ 'Cole' ], M: [ 'Mary' ], T: [ 'Travis' ] }