【发布时间】:2020-10-15 05:50:58
【问题描述】:
我正在使用 Formik 的 FieldArray 将对象动态添加到数组中,将其他表单元素渲染为对象被 push()ed 到数组中。
我的架构如下所示:
const EMAIL_SCHEMA = Yup.object().shape({
address: Yup.string().email().required( 'E-mail address is required.' ),
isPreferredContact: Yup.boolean()
})
const SCHEMA = Yup.object().shape({
emails: Yup.array()
.of( EMAIL_SCHEMA )
.ensure()
.compact( v => !v.address )
.required( 'At least one e-mail address is required.' )
})
对于每个电子邮件输入,都有一个对应的复选框来指示它是否是首选的联系人电子邮件地址。 不需要将电子邮件地址标记为首选。
我想做的是验证数组是否包含最多一个对象,其中isPreferredContact 是true。如果数组中有 3 个电子邮件对象并且isPreferredContact 对所有这些对象都是false,那么这是一个有效状态。也就是说:
let values = [
{address: '1@email.com', isPreferredContact: false},
{address: '2@email.com', isPreferredContact: false},
{address: '3@email.com', isPreferredContact: false}
] // OK
let values = [
{address: '1@email.com', isPreferredContact: true},
{address: '2@email.com', isPreferredContact: false},
{address: '3@email.com', isPreferredContact: false}
] // OK
let values = [
{address: '1@email.com', isPreferredContact: true},
{address: '2@email.com', isPreferredContact: true},
{address: '3@email.com', isPreferredContact: false}
] // Invalid
我看到了这个答案
Yup: deep validation in array of objects
表明compact()方法可用于验证至少一个,因为如果从数组中删除“假”值后,数组为空,那么很容易处理架构键无效。
不过,我看不到任何东西来验证数组是否包含至多一个具有 property = value 谓词的对象。
有没有办法做到这一点?
【问题讨论】: