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

如何将含嵌套对象的数据转换为关联ID的扁平化结构?

如何将对象中的嵌套字段替换为其内部的id值

需求场景

给定如下结构的对象:

const record = {
  id: 1,
  address: {id:100 , street: 'Kulas Light', suite: 'Apt. 556', city: 'Gwenborough'},
  company: {id:200,name: 'Romaguera-Crona', catchPhrase: 'Multi-layered client-server neural-net'},
  email: "Sincere@april.biz",
};

需要将address、company这类嵌套对象字段,替换为它们内部的id属性值,最终得到:

{
  id: 1,
  address:100,
  company:200,
  email: "Sincere@april.biz",
}

你的代码问题分析

你当前的代码只是筛选出值为对象的字段,然后生成了字符串,但既没有修改原对象,也没有构建新的目标对象;同时filter会直接排除非对象类型的字段(比如id、email),导致最终丢失这些必要字段,所以达不到预期效果。

解决方案

方案1:创建新对象(推荐,不修改原数据)

遍历原对象的所有键,判断对应值是否为非null的对象且包含id属性,是则取id,否则保留原值:

const transformedRecord = {};
for (const key of Object.keys(record)) {
  const value = record[key];
  // 避免处理null,且确保嵌套对象存在id属性
  if (typeof value === 'object' && value !== null && 'id' in value) {
    transformedRecord[key] = value.id;
  } else {
    transformedRecord[key] = value;
  }
}

方案2:用Object.fromEntries简化写法

利用Object.entries和map转换键值对,再生成新对象:

const transformedRecord = Object.fromEntries(
  Object.entries(record).map(([key, value]) => {
    if (typeof value === 'object' && value !== null && 'id' in value) {
      return [key, value.id];
    }
    return [key, value];
  })
);

方案3:直接修改原对象(允许修改原数据时使用)

如果不需要保留原对象,可以直接遍历修改:

for (const key of Object.keys(record)) {
  const value = record[key];
  if (typeof value === 'object' && value !== null && 'id' in value) {
    record[key] = value.id;
  }
}

注意事项

  • 必须判断value !== null,因为typeof null会返回object,避免处理null值时出错;
  • 增加'id' in value的判断,确保嵌套对象确实存在id属性,防止意外抛出错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:05:16