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

如何通过键值匹配嵌套对象与对象数组并替换指定字段值?

实现嵌套对象值替换数组对象的value字段

我拥有一个嵌套对象data1和一个对象数组data2,其中data2为原始数据源。需求如下:遍历data2中的每个对象,取其name字段的值,在data1中通过displayLevel1、displayLevel2指定的层级找到对应键的值,并用该值替换data2中对应对象的value字段值。例如将data2中Surname对应的value从Bush替换为data1中的Smith,Injury对应的value从Arm替换为Hand。

原始数据

let data1 = 
    {
      "fields": {
        "Main": {
          "Personal Details": {
            "Surname": "Smith",
            "Forename1": "John",
            "Nickname": "Johny",
            "Gender": "Male",
            "Date_of_Birth": "05/04/1979",
            "Marital_Status": "Divorced"
          },
          "More Details": {
            "Injury": "Hand",
          }
        }
      }
    }
    
let data2 = [
      {
        "name": "Surname",
        "displayName": "Surname",
        "value": "Bush",
        "dataType": "STRING",
        "displayLevel1": "Main",
        "displayLevel2": "Personal Details",
        "displayLevel3": ""
      },
      {
        "name": "Injury",
        "displayName": "Injury",
        "value": "Arm",
        "dataType": "STRING",
        "displayLevel1": "Main",
        "displayLevel2": "More Details",
        "displayLevel3": ""
      }
    ]

实现方案

方式1:直接修改原数组(使用forEach)

这种方式会直接改动data2的元素:

data2.forEach(item => {
  // 按层级从data1中取出对应值
  const targetValue = data1.fields[item.displayLevel1][item.displayLevel2][item.name];
  // 替换当前对象的value字段
  item.value = targetValue;
});

方式2:生成新数组(使用map,不修改原数组)

如果不想改动原数组,可以用map返回一个全新的数组:

const updatedData2 = data2.map(item => ({
  // 拷贝原对象的所有属性
  ...item,
  // 替换value字段为data1中对应的值
  value: data1.fields[item.displayLevel1][item.displayLevel2][item.name]
}));

容错处理(可选)

如果存在层级字段可能不存在的情况,建议添加可选链操作符避免报错,同时保留原value值:

// 直接修改原数组的容错版本
data2.forEach(item => {
  const targetValue = data1.fields?.[item.displayLevel1]?.[item.displayLevel2]?.[item.name];
  // 如果找到有效取值则替换,否则保留原value
  if (targetValue !== undefined) {
    item.value = targetValue;
  }
});

// 生成新数组的容错版本
const updatedData2 = data2.map(item => ({
  ...item,
  value: data1.fields?.[item.displayLevel1]?.[item.displayLevel2]?.[item.name] ?? item.value
}));

最终结果

处理后data2(或updatedData2)将变为:

[
      {
        "name": "Surname",
        "displayName": "Surname",
        "value": "Smith",
        "dataType": "STRING",
        "displayLevel1": "Main",
        "displayLevel2": "Personal Details",
        "displayLevel3": ""
      },
      {
        "name": "Injury",
        "displayName": "Injury",
        "value": "Hand",
        "dataType": "STRING",
        "displayLevel1": "Main",
        "displayLevel2": "More Details",
        "displayLevel3": ""
      }
    ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:50:25