是的,验证对象数组中的第一个和最后一个元素
Yup validation of first and last element in array of objects
我的表单 (Formik) 中有一个字段,其中包含对象数组,每个对象都有两个时间戳。我的验证模式现在适用于数组的所有元素,但目标是仅检查数组中的第一个和最后一个对象,所有其他对象可以为空。数组的长度是动态变化的。我该怎么做?
"timeslots": [
{
"startTime": "2021-10-31T22:30:00.000Z",
"endTime": "2021-11-01T00:30:00.000Z"
},
{
"startTime": "",
"endTime": ""
},
{
"startTime": "2021-11-02T22:30:00.000Z",
"endTime": "2021-11-03T00:00:00.000Z"
}]
这仅在所有对象都填充了时间戳时有效:
validationSchema={() =>
Yup.lazy(({ timeslots }) =>
? Yup.object({
timeslots:
timeslots.length > 0 &&
Yup.array().of(
Yup.object().shape({
startTime: Yup.string().required(INVALID_FORM_MESSAGE.requiredField),
endTime: Yup.string().required(INVALID_FORM_MESSAGE.requiredField),
}),
),
我不知道有什么方法可以使用 shape()
来做你想做的事,但你可以改用 test function:
validationSchema={
Yup.lazy(({ timeslots }) =>
Yup.object({
timeslots: Yup.array()
.of(
Yup.object().shape({
startTime: Yup.string(),
endTime: Yup.string()
})
)
.test({
name: 'first-and-last',
message: INVALID_FORM_MESSAGE.requiredField,
test: val =>
val.every(
({ startTime, endTime }, index) => {
if (index === 0 || index === val.length - 1) {
return !!startTime && !!endTime;
}
return true;
}
)
})
})
)}
我的表单 (Formik) 中有一个字段,其中包含对象数组,每个对象都有两个时间戳。我的验证模式现在适用于数组的所有元素,但目标是仅检查数组中的第一个和最后一个对象,所有其他对象可以为空。数组的长度是动态变化的。我该怎么做?
"timeslots": [
{
"startTime": "2021-10-31T22:30:00.000Z",
"endTime": "2021-11-01T00:30:00.000Z"
},
{
"startTime": "",
"endTime": ""
},
{
"startTime": "2021-11-02T22:30:00.000Z",
"endTime": "2021-11-03T00:00:00.000Z"
}]
这仅在所有对象都填充了时间戳时有效:
validationSchema={() =>
Yup.lazy(({ timeslots }) =>
? Yup.object({
timeslots:
timeslots.length > 0 &&
Yup.array().of(
Yup.object().shape({
startTime: Yup.string().required(INVALID_FORM_MESSAGE.requiredField),
endTime: Yup.string().required(INVALID_FORM_MESSAGE.requiredField),
}),
),
我不知道有什么方法可以使用 shape()
来做你想做的事,但你可以改用 test function:
validationSchema={
Yup.lazy(({ timeslots }) =>
Yup.object({
timeslots: Yup.array()
.of(
Yup.object().shape({
startTime: Yup.string(),
endTime: Yup.string()
})
)
.test({
name: 'first-and-last',
message: INVALID_FORM_MESSAGE.requiredField,
test: val =>
val.every(
({ startTime, endTime }, index) => {
if (index === 0 || index === val.length - 1) {
return !!startTime && !!endTime;
}
return true;
}
)
})
})
)}