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

ES6 Spread Operator处理JavaScript对象合并未达预期,求解决方案

问题分析与解决:Spread操作符合并对象时子数组被覆盖

你遇到的问题核心在于JavaScript展开运算符(...)的浅合并特性:当合并两个对象时,如果某个键在两个对象中都存在,后面对象的对应值会直接覆盖前面对象的该键值,而不会深入嵌套的对象或数组内部去合并内容。

看你的例子,obj1和obj2都包含WellSchema键,所以执行{ ...obj1, ...obj2 }时,obj2的WellSchema会直接替换掉obj1的WellSchema,自然就看不到obj1里的那两个well项了。

解决方案:手动处理嵌套数组的合并

要实现嵌套数组的追加,需要针对性地处理WellSchema下的well数组,这里有两种常用方式:

方式一:手动逐层展开合并(适合简单场景)

直接在合并对象时,显式拼接两个well数组:

const obj1 = { WellSchema: { well: [ {wellName: 'check1', uwi: '9000000123'}, {wellName: 'check2', uwi: '8000012432'} ] } }
const obj2 = { WellSchema: { well: [ {wellName: 'check3', uwi: '2113120002'}, {wellName: 'check4', uwi: '5679001211'}, {wellName: 'check5', uwi: '0987652221'}, {wellName: 'check6', uwi: '5345676542'} ] } }

const mutateIt = {
  ...obj1, // 先保留obj1的所有顶层属性
  WellSchema: {
    ...obj1.WellSchema, // 保留WellSchema里的其他属性(如果有的话)
    well: [...obj1.WellSchema.well, ...obj2.WellSchema.well] // 拼接两个well数组
  }
}

console.log(mutateIt)

这样就能得到你预期的合并结果,well数组会包含来自两个对象的所有项。

方式二:通用深合并函数(适合复杂嵌套场景)

如果你的对象嵌套层级更深,或者需要多次处理类似合并,可以写一个简单的深合并函数,自动处理对象和数组的合并:

function deepMerge(target, source) {
  let merged = { ...target };
  for (const key in source) {
    // 如果是嵌套对象,递归合并
    if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {
      merged[key] = deepMerge(merged[key] || {}, source[key]);
    } 
    // 如果是数组,拼接两个数组
    else if (Array.isArray(source[key])) {
      merged[key] = [...(merged[key] || []), ...source[key]];
    } 
    // 普通属性直接覆盖
    else {
      merged[key] = source[key];
    }
  }
  return merged;
}

const mutateIt = deepMerge(obj1, obj2);
console.log(mutateIt);

这个函数会递归遍历对象的所有层级,遇到数组就拼接,遇到嵌套对象就继续合并,通用性更强。

总结

展开运算符只负责顶层键值对的合并,嵌套结构需要手动处理或使用深合并逻辑,这样才能实现你想要的数组追加效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:41:21