You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Yup校验schema的results部分.test()中访问questions的值?

在Yup的results校验中访问questions数组的值

你可以通过Yup提供的context参数获取整个表单的完整数据,具体来说,context.parent指向当前校验对象的父级(也就是整个quiz对象),以此就能拿到questions数组的数据。

具体实现方法

  • 在test函数的第二个参数context中,通过context.parent.questions获取questions数组的全部内容。
  • 对questions数组做聚合计算(比如统计最小总分),再和当前result的值做校验对比。

修正后的代码示例

const quizSchema = Yup.object().shape({
    questions: Yup.array().of(
        Yup.object().shape({
            // 示例问题校验规则:每个问题必填points数字字段
            points: Yup.number().required('Points are required')
        })
    ),
    results: Yup.array().of(
        Yup.object().shape({
            // 示例结果校验规则:每个结果必填minPoints数字字段
            minPoints: Yup.number().required('Min points are required')
        })
        .test(
            'covers-all-values',
            'The first result should cover the minimum possible point total from all choices.',
            function(value, context) {
                // 获取顶层对象的questions数据
                const { questions } = context.parent;
                
                // 计算所有问题的最小总分(可根据实际业务逻辑调整计算方式)
                const totalMinPoints = questions?.reduce((sum, question) => sum + question.points, 0) || 0;
                
                // 仅校验第一个result的minPoints是否匹配总最小分
                if (context.path.includes('[0]')) {
                    return value.minPoints === totalMinPoints;
                }
                
                // 非第一个result直接通过校验
                return true;
            }
        )
    ),
});

关键注意点

  • context.parent能直接访问到顶层对象的所有属性,包括questions。
  • 要处理questions可能为undefined的情况,避免触发报错。
  • 示例中通过context.path判断是否为第一个result,匹配你需求中“第一个结果需覆盖最小总分”的校验逻辑。

内容的提问来源于stack exchange,提问作者Jimmy Blundell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:57:40