JavaScript:每4个元素为一组合并对象数组的优化方案
问题:合并每4个对象为一个去重的目标对象
我有一个长度可变的对象数组,每4个对象对应一个目标元素(数组不可修改)。数组里除了description、correctiveAction等字段外,存在大量重复数据。想找更优雅高效的方法,把每4个元素合并成一个对象,且公共字段不重复。
当前低效实现方案
const handleMergeDef = (defArr) => { let tempArr = [] for (let i = 0; i < defArr.length; i++) { tempArr.push({ ids: defArr[i].ids, referenceNumbers: defArr[i].referenceNumbers, description: defArr[i].description, correctiveAction: defArr[i+1].correctiveAction, correctedBy: defArr[i+2].correctedBy, correctedDate: defArr[i+3].correctedDate }) i+=3 } return tempArr }
原数组示例
[ { ids: ['123', '124'], referenceNumbers: [], description: '', }, { ids: ['123', '124'], referenceNumbers: [], correctiveAction: '', }, { ids: ['123', '124'], referenceNumbers: [], correctedBy: '', }, { ids: ['123', '124'], referenceNumbers: [], description: '', correctedDate: '', }, ... ]
预期输出
[ { ids: ['123', '124'], referenceNumbers: [], description: '', correctiveAction: '', correctedBy: '', correctedDate: '' }, { ids: ['456', '457'], referenceNumbers: [], description: '', correctiveAction: '', correctedBy: '', correctedDate: '' }, ... ]
优化实现方案
通用合并版本
先将数组按每4个元素分组,再用reduce合并每组内的所有对象——由于公共字段值完全重复,合并时不会出现覆盖问题:
const handleMergeDef = (defArr) => { const mergedArr = []; // 按4个元素为一组遍历数组 for (let i = 0; i < defArr.length; i += 4) { // 截取当前组并合并成单个对象 const group = defArr.slice(i, i + 4); mergedArr.push(group.reduce((result, obj) => ({ ...result, ...obj }), {})); } return mergedArr; };
确保公共字段取第一个值的版本
如果担心后续对象的公共字段意外覆盖初始值,可以明确只合并非公共字段:
const handleMergeDef = (defArr) => { const mergedArr = []; for (let i = 0; i < defArr.length; i += 4) { const group = defArr.slice(i, i + 4); // 以第一个对象为基础,保留公共字段 const baseObj = { ...group[0] }; // 合并后续对象的差异化字段 const finalObj = group.slice(1).reduce((merged, obj) => { const { ids, referenceNumbers, ...rest } = obj; return { ...merged, ...rest }; }, baseObj); mergedArr.push(finalObj); } return mergedArr; };
方案优势
- 代码简洁易维护:用数组原生方法替代手动索引赋值,逻辑清晰
- 鲁棒性更强:自动处理数组长度不是4的倍数的情况,避免原方案可能出现的索引越界问题
- 扩展性好:后续每组字段分布变化时,无需修改硬编码的索引,依然能正确合并
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

