如何将含嵌套对象的数据转换为关联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
相关产品推荐
相关产品推荐

