如何简化实现将数组中同键名对象合并为单个大对象
合并共享相同顶级键的嵌套对象数组
我懂你现在的需求:把一个由多个单键对象组成的数组,合并成一个顶级键对应合并后嵌套对象的结构——就像你给出的示例,将[{3:{"3_04":"answer1"}},{3:{"3_10":"other answer"}},{6:{"6_01":"Eos ut numquam dolor"}}]转换成{ 3: { "3_04": "answer1", "3_10": "other answer" }, 6: { "6_01": "Eos ut numquam dolor" } }。
你的现有代码能实现功能,但可以用Array.prototype.reduce大幅简化逻辑,让代码更简洁易读:
// 基于你的原始数组this.tempSurveyTextAnswersArray处理 const mergedAnswers = this.tempSurveyTextAnswersArray.reduce((acc, currentItem) => { // 获取当前对象的唯一顶级键 const topLevelKey = Object.keys(currentItem)[0]; // 初始化累加器中的对应键(如果不存在的话) if (!acc[topLevelKey]) { acc[topLevelKey] = {}; } // 合并嵌套对象的属性 Object.assign(acc[topLevelKey], currentItem[topLevelKey]); return acc; }, {}); // 合并到submitData中,保留原有数据 this.submitData = { ...(this.submitData || {}), ...mergedAnswers };
代码说明
reduce是处理这类累加合并场景的绝佳工具,它从初始空对象{}开始遍历数组- 每次遍历取出当前对象的唯一顶级键
topLevelKey - 若累加器
acc中不存在该键,则先初始化一个空对象作为其值 - 通过
Object.assign将当前对象的嵌套属性合并到累加器对应键的对象中 - 最后用扩展运算符
...把合并结果与原submitData合并,相比传统Object.assign写法更直观简洁
这个写法去掉了多余的中间数组和嵌套循环,逻辑清晰,可读性强,完全满足你的需求。
内容的提问来源于stack exchange,提问作者yangsunny
相关产品推荐
相关产品推荐

