javascript - Yup şemasına göre geçerli olmayan dizi öğelerini filtreleme
API'den gelen verileri doğrulamak ve tipini belirlemek için yup kullanıyorum. Aşağıdaki doğrulayıcılar ve tipim var:
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>;
Ve bu harika çalışıyor, diziler mükemmel şekilde doğrulanıyor ve türler beklendiği gibi varsayılıyor.
Tek sorun, bir diziyi nasıl doğrulayacağımdır, bunu şu şekilde yapıyorum:
await someListSchema.validate(data)
Ve eğer bir dizinin herhangi bir öğesi doğrulayıcı gereksinimlerini karşılamazsa bir hata fırlatır ve bütün doğrulama işlemi başarısız olur. Geçersiz dizi öğelerinden kurtulmak ve dizinin geri kalanını döndürmek istiyorum. Geçersiz öğeleri filtreleyip geçerli olanları tutarak doğrulamaya nasıl devam edilir?
Seçenek { abortEarly: false } ile deniyordum, ayrıca her eleman için doğrulama yaparken dizi üzerinde yineleme yaklaşımını da denedim, ama başarılı olamadım. Beklenen sonucu elde etmek için herhangi bir fikriniz var mı?
Saygılarımla, Bartosz.
Cevap #1
Diziyi döngüye alabilir ve nesneleri tek tek doğrulayabilirsiniz. Bu şekilde, bir nesne doğrulamadan geçmediğinde ne olmasını istediğinize dair kendi mantığınızı tanımlayabilirsiniz.
Örneğin,
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);
