JS reduce方法对后台数据的处理案例(秒解决)

目录

一、前言

二、案例1

三、案例二

四、小结


一、前言

     在我们项目开发阶段,当后端传回来的数据不太理想或者不好直接使用的话,那么此时我们就必须对数据进行处理,这次我就遇到了一种情况,当后端返回如下格式的数据,我们要对其进行分组处理。如果我没没有很好的处理方法的话,我相信这是非常消耗时间的,如果我们有所谓的“巧方法”,那么这些问题就不会再难到我们。  

二、案例1

当我们接收到后台传回来的数据,初始数据如下,对以下数据根据班级 class 进行分班

            const students = [
                {
                    name: '张三',
                    class: 1,
                    math: 100,
                    language: 80,
                    english: 60,
                    physics: 80,
                    chemistry: 60,
                },
                {
                    name: '李四',
                    class: 1,
                    math: 120,
                    language: 60,
                    english: 20,
                    physics: 100,
                    chemistry: 100,
                },
                {
                    name: '王五',
                    class: 1,
                    math: 140,
                    language: 90,
                    english: 120,
                    physics: 60,
                    chemistry: 60,
                },

                {
                    name: '苑博',
                    class: 2,
                    math: 140,
                    language: 90,
                    english: 120,
                    physics: 60,
                    chemistry: 60,
                },

                {
                    name: '文轩',
                    class: 2,
                    math: 110,
                    language: 60,
                    english: 120,
                    physics: 30,
                    chemistry: 30,
                },

                {
                    name: '聪健',
                    class: 3,
                    math: 110,
                    language: 60,
                    english: 120,
                    physics: 30,
                    chemistry: 30,
                },
                {
                    name: '烨磊',
                    class: 3,
                    math: 88,
                    language: 70,
                    english: 100,
                    physics: 45,
                    chemistry: 56,
                },
                {
                    name: '烨霖',
                    class: 3,
                    math: 120,
                    language: 60,
                    english: 100,
                    physics: 50,
                    chemistry: 60,
                },
                {
                    name: '荣轩',
                    class: 2,
                    math: 90,
                    language: 160,
                    english: 120,
                    physics: 50,
                    chemistry: 50,
                },
                {
                    name: '懿轩',
                    class: 2,
                    math: 100,
                    language: 90,
                    english: 120,
                    physics: 90,
                    chemistry: 90,
                },
                {
                    name: '擎苍',
                    class: 2,
                    math: 100,
                    language: 130,
                    english: 120,
                    physics: 10,
                    chemistry: 40,
                },
                {
                    name: '绍齐',
                    class: 1,
                    math: 100,
                    language: 90,
                    english: 120,
                    physics: 60,
                    chemistry: 60,
                },
                {
                    name: '皓轩',
                    class: 1,
                    math: 100,
                    language: 120,
                    english: 120,
                    physics: 50,
                    chemistry: 50,
                },
                {
                    name: '鹭洋',
                    class: 1,
                    math: 100,
                    language: 80,
                    english: 120,
                    physics: 30,
                    chemistry: 90,
                },
                {
                    name: '潇然',
                    class: 2,
                    math: 110,
                    language: 92,
                    english: 114,
                    physics: 56,
                    chemistry: 74,
                },
                {
                    name: '智宸',
                    class: 1,
                    math: 100,
                    language: 100,
                    english: 100,
                    physics: 30,
                    chemistry: 30,
                },
                {
                    name: '风华',
                    class: 1,
                    math: 110,
                    language: 60,
                    english: 120,
                    physics: 80,
                    chemistry: 79,
                },
                {
                    name: '雨泽',
                    class: 1,
                    math: 100,
                    language: 68,
                    english: 115,
                    physics: 36,
                    chemistry: 83,
                },
                {
                    name: '浩然',
                    class: 2,
                    math: 105,
                    language: 116,
                    english: 120,
                    physics: 90,
                    chemistry: 60,
                },
                {
                    name: '瑾瑜',
                    class: 3,
                    math: 110,
                    language: 60,
                    english: 120,
                    physics: 99,
                    chemistry: 98,
                },
            ];

这时我们通过写一个函数对数据进行处理,这里我们巧妙使用了reduce数组方法

reduce方法方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

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

第一个参数的回调函数又接收四个参数,分别为(初始值或计算结束后的返回值,当前元素,当前元素的索引,当前元素所属的数组对象)

第二个参数是传给函数的初始值,非必传

通过调用方法就可以对数据进行按班级分组,同时这种问题也可以使用for循环进行处理。

            function handleData(arr) {
                return arr.reduce((t, v) => {
                    // 判断当前班级是否已经创建,如果已经创建,就直接 push 新数据,如果没有创建,就使用
                    if (t[v.class]) {
                        t[v.class].push(v);
                    } else {
                        t[v.class] = [v];
                    }
                    return t;
                }, {});
            }

打印结果如下,分为三个班级,班级里有所属该班级的所有成员

三、案例二

对下面的数据进行处理,最终达到 省 - 市 - 区 一层包裹一层的效果,根据pid增加到对象的父亲的child里面,使数据不在冗余。方便我们后面直接查找归属地。

      const regions = [
        {
          id: "51",
          name: "四川省",
          pid: "0",
        },
        {
          id: "5101",
          name: "成都市",
          pid: "51",
        },
        {
          id: "5103",
          name: "自贡市",
          pid: "51",
        },
        {
          id: "5104",
          name: "攀枝花市",
          pid: "51",
        },
        {
          id: "5105",
          name: "泸州市",
          pid: "51",
        },
        
        {
          id: "5107",
          name: "绵阳市",
          pid: "51",
        },
        {
          id: "510101",
          name: "市辖区",
          pid: "5101",
        },
        {
          id: "510104",
          name: "锦江区",
          pid: "5101",
        },
        {
          id: "510105",
          name: "青羊区",
          pid: "5101",
        },
        {
          id: "510106",
          name: "金牛区",
          pid: "5101",
        },
        {
          id: "510107",
          name: "武侯区",
          pid: "5101",
        },
        {
          id: "510108",
          name: "成华区",
          pid: "5101",
        },
        {
          id: "510112",
          name: "龙泉驿区",
          pid: "5101",
        },
        {
          id: "510113",
          name: "青白江区",
          pid: "5101",
        },
        {
          id: "510114",
          name: "新都区",
          pid: "5101",
        },
        {
          id: "510115",
          name: "温江区",
          pid: "5101",
        },
        {
          id: "510116",
          name: "双流区",
          pid: "5101",
        },
        {
          id: "510117",
          name: "郫都区",
          pid: "5101",
        },
        {
          id: "510118",
          name: "新津区",
          pid: "5101",
        },
        {
          id: "510121",
          name: "金堂县",
          pid: "5101",
        },
        {
          id: "510129",
          name: "大邑县",
          pid: "5101",
        },
        {
          id: "510131",
          name: "蒲江县",
          pid: "5101",
        },
        {
          id: "510181",
          name: "都江堰市",
          pid: "5101",
        },
        {
          id: "510182",
          name: "彭州市",
          pid: "5101",
        },
        {
          id: "510183",
          name: "邛崃市",
          pid: "5101",
        },
        {
          id: "510184",
          name: "崇州市",
          pid: "5101",
        },
        {
          id: "510185",
          name: "简阳市",
          pid: "5101",
        },
        {
          id: "510301",
          name: "市辖区",
          pid: "5103",
        },
        {
          id: "510302",
          name: "自流井区",
          pid: "5103",
        },
        {
          id: "510303",
          name: "贡井区",
          pid: "5103",
        },
        {
          id: "510304",
          name: "大安区",
          pid: "5103",
        },
        {
          id: "510311",
          name: "沿滩区",
          pid: "5103",
        },
        {
          id: "510321",
          name: "荣县",
          pid: "5103",
        },
        {
          id: "510322",
          name: "富顺县",
          pid: "5103",
        },
        {
          id: "510401",
          name: "市辖区",
          pid: "5104",
        },
        {
          id: "510402",
          name: "东区",
          pid: "5104",
        },
        {
          id: "510403",
          name: "西区",
          pid: "5104",
        },
        {
          id: "510411",
          name: "仁和区",
          pid: "5104",
        },
        {
          id: "510421",
          name: "米易县",
          pid: "5104",
        },
        {
          id: "510422",
          name: "盐边县",
          pid: "5104",
        },
        {
          id: "510501",
          name: "市辖区",
          pid: "5105",
        },
        {
          id: "510502",
          name: "江阳区",
          pid: "5105",
        },
        {
          id: "510503",
          name: "纳溪区",
          pid: "5105",
        },
        {
          id: "510504",
          name: "龙马潭区",
          pid: "5105",
        },
        {
          id: "510521",
          name: "泸县",
          pid: "5105",
        },
        {
          id: "510522",
          name: "合江县",
          pid: "5105",
        },
        {
          id: "510524",
          name: "叙永县",
          pid: "5105",
        },
        {
          id: "510525",
          name: "古蔺县",
          pid: "5105",
        },
        {
          id: "510701",
          name: "市辖区",
          pid: "5107",
        },
        {
          id: "510703",
          name: "涪城区",
          pid: "5107",
        },
        {
          id: "510704",
          name: "游仙区",
          pid: "5107",
        },
        {
          id: "510705",
          name: "安州区",
          pid: "5107",
        },
        {
          id: "510722",
          name: "三台县",
          pid: "5107",
        },
        {
          id: "510723",
          name: "盐亭县",
          pid: "5107",
        },
        {
          id: "510725",
          name: "梓潼县",
          pid: "5107",
        },
        {
          id: "510726",
          name: "北川羌族自治县",
          pid: "5107",
        },
        {
          id: "510727",
          name: "平武县",
          pid: "5107",
        },
        {
          id: "510781",
          name: "江油市",
          pid: "5107",
        },
      ];

利用reduce对数据进行处理。

            function handleData(arr, rootId = '0') {
                return arr.reduce((newArr, item) => {
                    if (item.pid == rootId) {
                        item.children = handleData(regions, item.id);
                        newArr.push(item);
                    }
                    return newArr;
                }, []);
            }
            console.log(handleData(regions));

 这便是我们想要的数据格式。也可以实现三级联动效果。

四、小结

reduce对我们处理数据有很大帮助,往往能给我们带来惊喜。

感谢大家,欢迎评论区一起讨论学习。

猜你喜欢

转载自blog.csdn.net/qq_63299825/article/details/131150011