js的reduce用法 - 前端笔记-Array.reduce( Function, initValue ) 两个参数都非常的重要(虽然第二个可有可无) Function: 不用说,肯定是个回调函数。由开发者提供 ...

学习笔记

点滴记忆
回忆过往
首页>> web前端 >>js的reduce用法 - 前端笔记
2022-8-13
分类: web前端

js的reduce用法

文章作者:痴迷

Array.reduce( Function, initValue ) 两个参数都非常的重要(虽然第二个可有可无) Function: 不用说,肯定是个回调函数。由开发者......

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 = [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] || 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' ] }



×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

打赏作者
版权所有,转载注意明处:前端笔记 » js的reduce用法

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)