如何使用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
相关产品推荐
相关产品推荐

