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

如何使用Zod.js直接简化嵌套对象?无需array map方法

如何用Zod直接转换并校验数据(无需array map)

完全可以不用array.map,Zod的transform方法支持在校验数据的同时直接完成结构转换,一步得到你想要的简化数据结构。

修改后的Schema实现

把原Schema里的images字段通过transform直接提取嵌套的image_url,同时保留mal_id:

const apiUrl = 'https://api.jikan.moe/v4/top/anime';

// 定义带转换的Schema
const DataSchema = z.array(
  z.object({
    mal_id: z.number().nullable(),
    images: z.object({
      jpg: z.object({
        image_url: z.string().nullable()
      })
    })
  }).transform(anime => ({
    mal_id: anime.mal_id,
    images: anime.images.jpg.image_url // 直接提取嵌套字段
  }))
)

type TransformedAnime = z.infer<typeof DataSchema>;

async function fetchTopAnime() {
  try {
    const response = await axios.get(apiUrl);
    const rawData = response.data;
    // 校验后直接得到转换好的数据,无需map
    const myExpectedData = DataSchema.parse(rawData.data);

    console.log(myExpectedData);
  } catch (error) {
    console.error(`Error fetching data: ${error}`);
  }
}

fetchTopAnime();

关键说明

  • transform方法会在校验原始数据结构合法之后,将输入的对象转换为你指定的新结构,相当于把校验和数据转换合并成一步。
  • 新的类型TransformedAnime会自动推断为转换后的结构:Array<{ mal_id: number | null; images: string | null }>,和你原来myExpectedData的类型完全一致。
  • 这样处理后,parse方法返回的结果直接就是你想要的简化数据,不需要再额外调用map遍历数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:03:11