如何转换API返回的含对象数组的对象,提取name字段的指定语言(FR/EN)值?
修复你的API响应转换代码
先拆解下你代码里的几个核心问题:
- 语法括号错误:你在
map调用和对象字面量的括号配对上出现了问题,option1的map结尾多了逗号,外层对象的闭合逻辑也不正确,直接导致代码无法运行。 - 变量命名冲突:内层
map里重复用obj作为参数,既影响可读性,也容易在复杂逻辑里引发混淆。 - Locale大小写不匹配:API返回的name属性是小写的
fr/en,但你的locale参数是大写的FR/EN,直接取值会得到undefined。
下面是修复后的完整可运行代码:
// 先定义类型保障类型安全 interface RawOptionItem { name: { fr: string; en: string }; price: number; } interface RawOptionsResponse { _id: number; option1: RawOptionItem[]; option2: RawOptionItem[]; } interface TransformedOptionItem { name: string; price: number; } interface TransformedOptions { option1: TransformedOptionItem[]; option2: TransformedOptionItem[]; } // 假设locale是传入的参数,类型限定为'FR' | 'EN' transformOptions(optionsUrl: string, locale: 'FR' | 'EN') { // 把大写locale转成小写,匹配API返回的字段名 const lowerCaseLocale = locale.toLowerCase() as 'fr' | 'en'; return this.http.get<RawOptionsResponse>(optionsUrl).pipe( map(rawObj => ({ // 如果不需要保留_id,可以删除这一行 // _id: rawObj._id, option1: rawObj.option1.map(item => ({ ...item, name: item.name[lowerCaseLocale] })), option2: rawObj.option2.map(item => ({ ...item, name: item.name[lowerCaseLocale] })) })) as Observable<TransformedOptions> ); }
代码说明:
- 类型约束:新增了原始响应和转换后数据的类型定义,让TypeScript能提供实时类型检查,避免后续逻辑出错。
- Locale兼容处理:将传入的大写
locale转成小写,确保和API返回的fr/en字段完全匹配。 - 语法修复:修正了括号配对问题,把内层
map的参数名改成item,避免和外层的rawObj命名冲突。 - 属性保留:用扩展运算符
...保留了原对象的其他属性(比如price),只替换name字段为对应语言的值。
内容的提问来源于stack exchange,提问作者mbagiella
相关产品推荐
相关产品推荐

