js根据某属性对json数组分类

原数据:

        var arr = [
            {name: '张三', age: 23, work: '计算机'},
            {name: '王五', age: 29, work: '计算机'},
            {name: '张兴', age: 30, work: '考古'},
            {name: '刘豆豆', age: 23, work: '物理'},
            {name: '李铁锤', age: 20, work: '英语'},
            {name: '毛豆豆', age: 20, work: '英语'},
            {name: '王五5', age: 23, work: '计算机'},
        ];

需求:

统计一共有几种学科,哪个学科人数 最多,并给其分类。

方法一:

        let maxCount = 0;
        let allGroups = {}
        const group = arr.reduce((prev, curr) => {
            if (!prev[curr.work]) {
                prev[curr.work] = 1;
                allGroups[curr.work] = []
            } else {
                prev[curr.work] += 1;
            }
            allGroups[curr.work].push(curr);
            maxCount = Math.max(maxCount, prev[curr.work]);
            return prev;
        }, {});
        const groups = Object.keys(group);
        console.log(allGroups)
        console.log(`总共有${groups.length}科目;${groups.find((g) => group[g] === maxCount)}科目最多`);

结果:

 

 方法二:

        const hashCout = {}
        const newObj = arry.reduce((prev, curr) => {
            if (curr && !prev[curr.work]) {
                prev[curr.work] = [curr]
                hashCout[curr.work] = 0
            } else {
                prev[curr.work].push(curr)
            }
            hashCout[curr.work]++
            delete curr.work
            return prev
        }, {})
        console.log(newObj)
        console.log("科目数:" + Object.keys(newObj).length)
        for (let i in hashCout){
            if (hashCout[i]==(Math.max(...Object.values(hashCout)))){
                console.log("人数最多的科目:" + i)
            }
        }

结果:

需求2:

如果只是光根据属性:work对其分类则代码如下

        const map = new Map()
        arry.forEach(item => map.get(item.work) ? map.get(item.work).push(item) : map.set(item.work,[item]))
        console.log(map)

结果:

 

 

posted @ 2022-07-01 15:32  爱喝酸奶的吃货  阅读(626)  评论(0)    收藏  举报