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

JavaScript按索引合并两个数组并合并同位置对象属性的实现问题

问题核心缺陷说明

你原有代码的问题有两处:

  • JSON.stringify() 没有传入待对比的array1[i]和array2[i]参数,因此对比结果永远相等,导致同索引双对象场景下永远不会推入array1[i]
  • 缺少对象合并的逻辑,只做了是否推入array1[i]的判断,没有实现属性合并的需求

修改后代码

let array1 = ["a", "b", {p2: 'goodbye'},"c", "d"],
  array2 = [1, 2,  {p1: 'hello'}],
  result = [],
  i, l = Math.min(array1.length, array2.length);

for (i = 0; i < l; i++) {
  const item1 = array1[i]
  const item2 = array2[i]
  // 新增null判断,避免typeof null === 'object'的原生语法坑
  if (typeof item1 === 'object' && typeof item2 === 'object' && item1 !== null && item2 !== null) {
    // 序列化对比两个对象属性是否完全相等
    const isObjEqual = JSON.stringify(item1) === JSON.stringify(item2)
    if (isObjEqual) {
      // 属性完全一致仅保留array2的对象
      result.push(item2)
    } else {
      // 属性不一致合并两个对象,array2属性优先级更高,重名会覆盖array1的属性
      result.push({...item1, ...item2})
    }
  } else {
    result.push(item2, item1);
  }
}
result.push(...array1.slice(l), ...array2.slice(l));

console.log(result);

逻辑说明

  • 同索引双对象场景下,先通过序列化对比判断属性是否完全一致,相等仅推入array2的对象,不等则合并属性后推入
  • 其余逻辑与原需求保持一致:非对象类型按array2[i]、array1[i]顺序推入,超出最小长度的剩余元素追加到结果末尾
  • 如果你需要支持多层嵌套对象的合并和对比,可以把序列化对比替换为深对比方法,展开替换为深合并逻辑,当前代码适用于单层对象的常见场景

测试效果

针对你给出的测试输入:
array1 = ["a", "b", {p2: 'goodbye'},"c", "d"]
array2 = [1, 2, {p1: 'hello'}]
运行后输出为:
[1, 'a', 2, 'b', {p1: 'hello', p2: 'goodbye'}, 'c', 'd']
完全符合预期需求。

内容的提问来源于stack exchange,提问作者KeyGy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:06:03