数组的扁平化处理和reduce方法

121 阅读1分钟
<script>
        const arr = [1, [ 2, [ 3 , [ 4 , 5 ]]], 6]  //=> [1, 2, 3, 4, 5, 6]
        /*
            方法一、使用flat()
        */
        let arr1 = arr.flat(Infinity)
        // console.log(arr1)

        /*
            方法二、递归
        */
        let res = []
        let fn = (arr)=>{
            for(let i = 0; i< arr.length; i++){
                if(Object.prototype.toString.call(arr[i]) === '[object Array]'){
                    fn(arr[i])
                }else {
                    res.push(arr[i])
                }
            }
        }
        fn(arr)
        // console.log(res)

        /*
            方法三、数组reduce

            - arr 表示操作的原数组
            - prev 表示上一次调用回调时的返回值, 或者初始值 init
            - cur 表示当前正在处理的数组元素
            - index 表示当前正在处理的数组元素的索引,若提供init值, 则索引为0, 否则索引为1
            - init 表示初始值

        */
        // reduce: 多维数组转为一维数组
        let arr2 = (arr) => {
            return arr.reduce((pre, cur)=>{
                return pre.concat(Array.isArray(cur) ? arr2(cur) : cur)
            }, [])
        }
        // console.log(arr2(arr))
        
        // reduce 求和
        let arrTest = [ 1, 2, 3, 4]
        let sum = arrTest.reduce((pre, cur) =>{
            return pre + cur
        }, 2)
        // console.log(sum)

        // reduce 计算数组中每个元素出现的次数
        let person = ['张曼玉', '刘嘉玲', '梅艳芳', '关之琳', '杨幂', '杨幂']
        let nameNum = person.reduce((pre, cur)=>{
            if(cur in pre){
                pre[cur]++
            }else {
                pre[cur] = 1
            }
            return pre
        }, {})
        console.log(nameNum)

        // reduce 数组去重
        let repeat = [1, 1, 2, 3, 4, 4, 5, 4, 1, 3]
        let repeatArr = repeat.reduce((pre, cur) => {
            if(!pre.includes(cur)){
                return pre.concat(cur)
            }else {
                return pre
            }
        }, [])
        console.log(repeatArr)
    </script>