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

如何转换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>
  );
}

代码说明:

  1. 类型约束:新增了原始响应和转换后数据的类型定义,让TypeScript能提供实时类型检查,避免后续逻辑出错。
  2. Locale兼容处理:将传入的大写locale转成小写,确保和API返回的fr/en字段完全匹配。
  3. 语法修复:修正了括号配对问题,把内层map的参数名改成item,避免和外层的rawObj命名冲突。
  4. 属性保留:用扩展运算符...保留了原对象的其他属性(比如price),只替换name字段为对应语言的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:53:14