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

如何正确合并任意深度的对象数组?React+TypeScript适配方案

解决方案:深度匹配合并嵌套对象数组

刚碰到过类似的嵌套对象合并需求,普通的浅合并或者直接用 lodash.merge(如果你之前试的是这个)确实搞不定——问题核心是得先按 name 字段匹配数组里的目标对象,再递归合并嵌套的 sub 层级,不管嵌套多深都能处理。结合你的 React+TypeScript 环境,给你写个适配的实现方案:

1. 先定义类型(TypeScript 必备)

首先给嵌套对象定义接口,确保类型安全:

interface NestedItem {
  name: string;
  sub: NestedItem | Record<string, never>; // 用Record<string, never>表示空对象更严谨
}

2. 实现递归深度合并函数

这个函数负责处理单个嵌套对象的层级合并,会递归遍历所有 sub 节点:

const deepMergeNestedItems = (target: NestedItem, source: NestedItem): NestedItem => {
  // 先复制目标对象的基础属性
  const merged = { ...target };

  // 如果源对象的sub非空,递归合并;否则保留目标对象的sub
  if (Object.keys(source.sub).length > 0) {
    merged.sub = deepMergeNestedItems(
      target.sub as NestedItem,
      source.sub as NestedItem
    );
  }

  return merged;
};

3. 处理数组的匹配与合并

遍历原始数组,找到和新对象 name 匹配的项,调用上面的合并函数,其他项直接保留:

const mergeNestedItemArray = (originalArray: NestedItem[], newItem: NestedItem): NestedItem[] => {
  return originalArray.map(item => 
    item.name === newItem.name 
      ? deepMergeNestedItems(item, newItem) 
      : item
  );
};

4. 测试你的用例

把你的测试数据代入验证:

// 原始数组
const originalArray: NestedItem[] = [
  { name: "test", sub: { name: "asdf", sub: {} } },
  { name: "models", sub: {} }
];

// 需要合并的新对象
const newItem: NestedItem = {
  name: "test",
  sub: { name: "asdf", sub: { name: "inside_asdf", sub: {} } }
};

// 执行合并
const mergedArray = mergeNestedItemArray(originalArray, newItem);
console.log(mergedArray);

输出结果完全符合你的预期:

[ { name: "test", sub: { name: "asdf", sub: { name: "inside_asdf", sub: {} } } }, { name: "models", sub: {} } ]

补充说明

这个逻辑支持任意层级的嵌套合并——哪怕你要给 inside_asdf 的 sub 再嵌套新内容,只要遵循 name + sub 的结构,函数都会自动递归合并。

如果你之前试的是 lodash 的 merge 方法,没得到预期结果的原因是:它默认按数组索引合并,不会根据 name 字段匹配对象,所以必须先手动匹配到目标项再合并。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:53:01