You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:40:48