js reduce函数使用案例

本文通过实例详细介绍了JavaScript中reduce函数的使用,包括将树形数据转换为扁平数据、扁平数据转树形数据、数组去重、统计字符出现次数、多维数组转一维数组以及对象属性求和等操作。同时展示了如何利用reduce实现复杂的数据转换和计算。
摘要由CSDN通过智能技术生成

js reduce函数使用案例

使用说明

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

接受四个参数:

  1. 初始值(或者上一次回调函数的返回值)
  2. 当前元素值
  3. 当前索引
  4. 调用 reduce 的数组

树形数据转换扁平数据

        let result = [{
            "id": 1,
            "name": "1级1",
            "parentId": 0,
            "children": [{
                "id": 4, 
                "name": "1级1-1", 
                "parentId": 1, 
                "children": [{ 
                    "id": 6, 
                    "name": 
                    "1级1-1-1", 
                    "parentId": 4, 
                    "children": [{ 
                        "id": 15, 
                        "name": "1级1-1-1-1", 
                        "parentId": 6, 
                        "children": [] }] }]
            }]
        }, { "id": 13, 
        "name": "3级1", 
        "parentId": 0, 
        "children": [{ 
            "id": 14, 
            "name": 
            "3级1-1", 
            "parentId": 13, 
            "children": [] }] }, 
            { 
            "id": 2, 
            "name": "2级1",
            "parentId": 0, 
            "children": [{
                "id": 12, 
                "name": "2级1-1", 
                "parentId": 2, 
                "children": [] }] }]
//树形数据转换编平数据
let list = result.reduce(function (pre,cur) {
    console.log(cur);
    pre.push({
        id:cur.id,
        name:cur.name,
        parentId:cur.parentId
    }) 
    cur.children &&  cur.children.forEach(el => {
        //多用于递归调用,对于没有函数名的匿名函数也非常起作用
        arguments.callee(pre,el)
    });
    return pre
},[])


console.log(list);

扁平数据转换树形数据

 const temp = [
            {
                'id': 1,
                'name': '1级1',
                'parentId': 0
            },

            {
                'id': 13,
                'name': '3级1',
                'parentId': 0
            },
            {
                'id': 4,
                'name': '1级1-1',
                'parentId': 1
            },
            {
                'id': 6,
                'name': '1级1-1-1',
                'parentId': 4
            },
            {
                'id': 12,
                'name': '2级1-1',
                'parentId': 2
            },

            {
                'id': 14,
                'name': '3级1-1',
                'parentId': 13
            },
            {
                'id': 15,
                'name': '1级1-1-1-1',
                'parentId': 6
            },
            {
                'id': 2,
                'name': '2级1',
                'parentId': 0
            },
        ]
        const result = temp.reduce(function (prev, curr, i, arr) {
            curr.children = arr.filter(v => v.parentId === curr.id)
            if (curr.parentId == 0) {
                prev.push(curr)
            }
            return prev
        }, [])

数组去重

//数组去重
        let  arr2 = [1,1,1,12,2,4,5,5,6,7,8]
        let sun = arr2.reduce((pre,cur) => {
            if(!pre.includes(cur)){
                return pre.concat(cur)
            }else{
                return pre
            }
        },[])
        console.log(sun);

统计字符出现次数,输出最多的字符和次数


        let cuelist  = 'sdfesrfjselfjaiosadjfsafdwsfjsdiorjffsdjfsdjhtioghjerjfgsdjfsdf'
        let yum = cuelist.split('').reduce((pre,cur) => {
            if(cur in pre){
                pre[cur] ++
            }else{
                pre[cur] = 1
            }
            return pre
        },{})
        console.log(yum);

多维数组转换一维数组

let arr1 = [[1, 2], [1, [11, 23, [1, 1, [2, [1]]]]]]

        let newArr1 = function (arr) {
            return arr.reduce((pre, cur) => pre.concat(Array.isArray(cur) ? newArr1(cur) : cur), [])
        }

对象里的属性求和

var result = [
    {
        subject: 'math',
        score: 10
    },
    {
        subject: 'chinese',
        score: 20
    },
    {
        subject: 'english',
        score: 30
    }
];

var sum = result.reduce(function(prev, cur) {
    return cur.score + prev;
}, 0);
console.log(sum) //60

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vue1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值