美文网首页
JS 中 一个数组中有多个对象,若对象的某个属性相同,则合并对象

JS 中 一个数组中有多个对象,若对象的某个属性相同,则合并对象

作者: lazy_tomato | 来源:发表于2021-08-31 22:52 被阅读0次

    START

    • 最近遇到一个场景,需要前端去处理一下数据,需求如题。
    • 实现起来,发现有点恶心,记录一下。

    详情介绍

    1.需要处理的数据

    let arr = [{
        id: 1,
        name: "11111"
    }, {
        id: 2,
        name: "22211"
    }, {
        id: 3,
        name: "33311"
    }, {
        id: 3,
        name: "33322"
    }, {
        id: 1,
        name: "11122"
    }, {
        id: 1,
        name: "11133"
    }]
    
    

    2.需要做的操作

    • 为了方便理解,我这里在讲一下实际的需求
      1. 存在一个数组,包含多个对象
      2. 找到id相同的对象,并且合并
      3. 合并要求:相同属性抽离出来,不相同的属性,统一放在这个对象的list中(对象的形式)

    3.实现方式

    
    var arr = [{
        id: 1,
        name: "11111"
    }, {
        id: 2,
        name: "22211"
    }, {
        id: 3,
        name: "33311"
    }, {
        id: 3,
        name: "33322"
    }, {
        id: 1,
        name: "11122"
    }, {
        id: 1,
        name: "11133"
    }]
    
    
    // 1.声明一个变量,存储处理过后的数组
    let end = []
    
    // 2.第一项肯定是不会重复的,我们直接将第一项存储到最终的数组中
    end.push({
        id: arr[0].id,
        list: [arr[0]]
    })
    console.log(end, end[0].list, 'qqq')
    
    // 3.这里对要处理的数组大小做一下校验
    if (arr.length > 0) {
    
        // 4.第一层遍历,遍历我们要处理的数组,注意,第一项我们处理了,所以这里索引从数组第二项 `1` 开始 
        for (let i = 1; i < arr.length; i++) {
    
            // 5.这里遍历一下 我们最终要输出的数组, `j`放在外面声明,因为后续或用到。
            let j = 0
            for (; j < end.length; j++) {
                // 6. 判断两个数组中的id是否相同
                if (arr[i].id === end[j].id) {
                    // 7.相等就将我们比较的对象 `arr[i]` 存储到  相同id对象的list 中
                    end[j]["list"].push(arr[i])
                    // *** 8.这里要理解,我们每次遍历,其实都是处理  `arr[i]` ,而上面的逻辑已经处理了,所以终止后续的循环 break;
                    break;
                }
            }
    
            // 9. 如果j 和 end.length相等,说明上面的 for循环没有被跳过,循环都执行完了。那么就说明,两个对象没有相同的id。所以下面去按照要求去push一下 
            if (j === end.length) {
                let list = []
                list.push(end[i])
                end.push({
                    id: arr[i].id,
                    list: [arr[i]]
                })
            }
    
        }
    }
    
    console.log(end)
    
    

    4.运行结果

    如下图


    394fb6a55fd36409adc3e1122d66ec6.png

    END

    • 说实话这个需求还是有点意思的。
    • 研究了好一会,希望后续再遇到这种需求,上手就来,互勉。

    相关文章

      网友评论

          本文标题:JS 中 一个数组中有多个对象,若对象的某个属性相同,则合并对象

          本文链接:https://www.haomeiwen.com/subject/trptwltx.html