怎么重复循环合并多个对象,并且不覆盖?使用Object.assign会直接覆盖掉

我有N条数据需要循环获取,并且合并到同一个对象里,现在使用Object.assign方法会导致他循环覆盖掉之前获取到的内容,需要怎么写才能不覆盖?
我现在代码是这样的,比如循环100次,获取100条数据,结果全被覆盖了,只留下来最后一条数据

for (i = 0; i < 100; i++) {
        data = Object.assign(data,{a:{"b":b,"c":{"c1":c1,"c2":c2}}});
    }

我数据表大概是这样的,并且数据还在继续增加,所以必须要用循环调用出来,然后赋值到变量里
image.png

想要的结果是 每次循环获取1行数据,然后把获取到的每行数据合并到一个对象里

遇到同一个变量a,会嵌套不同的变量b的内容进去,而不是覆盖

并且变量 a,b,c 由于数据的更新,数据都可能会持续增加,不限于仅3个公司4个规格,可能会更多

想要合并后的结果是下面这样的,全部数据在一个对象里

{
    公司1:{
        规格1:{
            价格:{
                c1:101,
                c2:201,
                c3:301,
                c4:401
            }
        }
        规格2:{
            价格:{
                c1:102,
                c2:202,
                c3:302,
                c4:402
            }
        }
        规格3:{
            价格:{
                c1:103,
                c2:203,
                c3:303,
                c4:403
            }
        }
        规格4:{
            价格:{
                c1:104,
                c2:204,
                c3:304,
                c4:404
            }
        }
    }
    公司2:{
        规格1:{
            价格:{
                c1:91,
                c2:191,
                c3:291,
                c4:291
            }
        }
        规格2:{
            价格:{
                c1:92,
                c2:192,
                c3:292,
                c4:292
            }
        }
        规格3:{
            价格:{
                c1:93,
                c2:193,
                c3:293,
                c4:293
            }
        }
        规格4:{
            价格:{
                c1:94,
                c2:194,
                c3:294,
                c4:294
            }
        }
    }
    公司3:{
        规格1:{
            价格:{
                c1:71,
                c2:171,
                c3:271,
                c4:271
            }
        }
        规格2:{
            价格:{
                c1:72,
                c2:172,
                c3:272,
                c4:272
            }
        }
        规格3:{
            价格:{
                c1:73,
                c2:173,
                c3:273,
                c4:273
            }
        }
        规格4:{
            价格:{
                c1:74,
                c2:174,
                c3:274,
                c4:274
            }
        }
    }
}
阅读 4.2k
3 个回答

你需要的东西称为 Merge,在很多配置文件里都有这样的操作,以便定义不同层次的配置并合并使用。

如果想要自己实现,需要递归进行一层一层的合并。这里建议直接使用 Lodash 的 merge 方法。直接点链接进去看,我就不多说了。


已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

说实话,确实没看懂您的描述。

Object.assign方法会将两个object类型的数据进行合并,若key相同,则后面的数据覆盖前面的数据,若不相同,则在前面的object进行添加。

你这个例子中,第2个参数是个固定的{a:{"b":b,"c":{"c1":c1,"c2":c2}}},c1, c2可能是变量,但最外层的key都是a,object类型的数据结构,没法存储两个相同的key,循环100次后,得到的就是最后一次的数据。

不过可以使用数组类型。

const arr = [];

for(let i=0; i<100; i++) {
    arr.push({a:{"b":b,"c":{"c1":c1,"c2":c2}}});
}

console.log(arr);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题