数组归并方法reduce()总结

数组归并方法reduce()

ECMAScript为数组提供了两个归并方法:reduce()和 reduceRight()。

相同点:

迭代数组的所有项,在此基础上构建一个返回值。

不同点:

reduce()从数组第一项开始遍历到最后一项;(从左开始)

reduceRight()从数组最后一项开始遍历到第一项。(从右开始)

以ruduce()为例( reduceRight()方法与之类似,遍历方向相反)

reduce()接收两个参数:对每一项都会运行的归并函数,可选的归并起点值。

对每一项都会运行的归并函数,即传给ruduce()的函数接收四个参数:

上一个归并值prev、当前值cur、当前索引值index、数组本身array。(这个函数的返回值作为下一次调用该函数的第一个参数)

归并起点值:若未设归并起点值,则第一次迭代从数组第二项开始,因此传给归并函数的第一个参数prev是数组的第一项,第二个参数cur是数组的第二项。

arr.reduce( function ( prev, cur, index, array){}, 归并起点值);
1、数组求和、数组求乘积(未设归并起点值)
// 1.数组求和
        let arr = [1, 2, 3, 4, 5];
        let sum = arr.reduce((prev, cur) =>  prev + cur);
        console.log(sum);//15

// 1.数组求和
        let arr = [1, 2, 3, 4, 5];
        let sum = arr.reduce((prev, cur) => {
            return prev + cur
        });
        console.log(sum);//15

2、计算数组中每个元素出现的次数
        // 2.计算数组中每个元素出现的此时
        let names = ['aa', 'bb', 'cc', 'aa', 'bb'];
        //创建nameNum对象存储元素及出现次数
        let nameNum = names.reduce((prev, cur) => {
            if (!prev[cur]) {
                prev[cur] = 1;
            }
            else {
                prev[cur]++;
            }
            return prev;
        }, {})
        console.log(nameNum);

在这里插入图片描述

3、简单的数组去重
       // 3、简单的数组去重
        let arr3 = [1, 1, 1, 2, 3, 4, 4, 5];
        // 创建newArr数组对象存储去重后的数组
        let newArr = arr3.reduce((prev, cur) => {
            if (!prev.includes(cur)) {
                // console.log(typeof prev);//object
                // console.log(typeof cur);//number
                //不同类型不能prev.push(cur)
                return prev.concat(cur);
            }
            else {
                return prev;
            }
        }, []);
        console.log(newArr);//[1, 2, 3, 4, 5]
4、数组对象去重
       // 4.数组对象去重
        let arr = [
            { name: 'mom', id: 1 },
            { name: 'timo', id: 2 },
            { name: 'mom', id: 1 },
            { name: 'timo', id: 2 },
        ]
        // obj对象存放id属性,过渡
        let obj = {}
        let newArr = arr.reduce((prev, cur) => {
            // console.log(typeof prev);//object
            // console.log(typeof cur);//object
            //法1
            // obj[cur.id] ? "" : (obj[cur.id] = true && prev.push(cur));
            //法2
            if(!obj[cur.id]){
                prev.push(cur);
                obj[cur.id]=true;
            }
            return prev;
        }, [])
        console.log(obj);
        console.log(newArr);// [{name: 'mom', id:1}, {name: 'timo', id:2}]

在这里插入图片描述

5、二维数组转化为一维数组
     // 5、二维数组转化为一维数组
        let arr = [[0, 1], [2, 3], [4, 5]]
        let newArr = arr.reduce((prev, cur) => {
            return prev.concat(cur)
        }, [])
        console.log(newArr); // [0, 1, 2, 3, 4, 5]
6、多维数组转化为一维数组(递归)
   // 6、多维数组转化为一维数组(递归)
        let arr = [1, [2, 3, [4, [5]]]];
        let newArr = function (arr) {
            return arr.reduce((prev, cur) => {
                 return prev.concat(Array.isArray(cur) ? newArr(cur) : cur)
            }, [])
        }
        console.log(newArr(arr));// [1, 2, 3, 4, 5]
参考资料

[1] 红宝书(第四版)
[2] reduce()方法详解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值