javascript - Yupスキーマに基づいて有効でない配列要素をフィルタリングする
私は API から来るデータを検証および型付けするために yup を使用しています。次のバリデーターと型があります:
export const someSchema = object({
id: number().required(),
name: string().required(),
someArray: array().of(string()),
date: dateSchema,
}).from('date', 'startDate')
export const someListSchema = array().of(someSchema)
export type SomeType = InferType<typeof someSchema>;
そしてそれは見事に機能します。配列は完璧に検証され、型も期待通りに想定されます。
唯一の問題は、配列をどのように検証するかで、次の方法で行っています:
await someListSchema.validate(data)
そして、もし配列の要素のいずれかがバリデータの要件を満たさない場合、エラーが発生し、バリデーション全体が失敗します。無効な配列要素を取り除き、残りの配列を返したいと思います。無効な要素をフィルタリングして有効な要素を保持しながら、どのようにバリデーションを進めますか?
オプション { abortEarly: false } を使って試してみましたし、配列を繰り返し処理して各要素ごとにバリデーションを行う方法も試しましたが、うまくいきませんでした。期待する結果を得るにはどうすればよいでしょうか?
よろしく、バルトシュ。
回答 #1
配列をループして、オブジェクトを個別に検証することができます。こうすることで、オブジェクトが検証に通らなかった場合に何を起こすか、自分自身のロジックを定義することができます。
例えば、
export const someSchema = object({
id: number().required(),
name: string().required(),
someArray: array().of(string()),
date: dateSchema,
}).from('date', 'startDate');
const results = await Promise.allSettled(data.map((object) => someSchema.validate(object)));
const filteredResults = results.filter(({status}) => status === "fulfilled").map(({value}) => value);
