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

2021-08-31  本文已影响0人  lazy_tomato

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.需要做的操作

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

上一篇 下一篇

猜你喜欢

热点阅读