javascript - Joi 验证对象列表,如果它在一个对象中,则所有对象都必须包含可选键
问题描述
我有一个包含以下必需键的对象列表:
日期、时间、价格
我想添加一个可选键“订单”,如果这些对象之一包含该可选键,它们都必须。我将如何用 joi 验证这一点?
解决方案
您可以根据要验证的数组动态创建模式。如果数组有一些具有order
属性的对象,那么模式应该要求数组中每个对象的这个属性,否则,模式应该将此属性视为可选:
const schemaFactory = input =>
Joi.array().items(
Joi.object().keys({
Date: Joi.required(),
Time: Joi.required(),
Price: Joi.required(),
order: input.some(item => item.hasOwnProperty('order'))
? Joi.required()
: Joi.optional()
})
)
const input = [
{ Date: 1, Time: 2, Price: 3 },
{ Date: 1, Time: 2, Price: 3, order: true },
]
const schema = schemaFactory(input)
const result = schema.validate(input)
if (result.error) {
console.log(result.error)
}
<script src="https://cdn.jsdelivr.net/npm/joi-browser@13.4.0/dist/joi-browser.min.js"></script>
推荐阅读
- android - 如何从 android studio 中的 Cowin Public API 解决错误代码 403?
- python - 遍历日期以计算差异
- javascript - nodejs PythonShell,如何在运行函数中导出变量
- gradle - Gradle 带来错误版本的传递依赖[Gradle 中的 java.lang.NoClassDefFoundError]
- docker - 如何在 docker apache 服务器中添加虚拟主机?
- python - 更改字典 Python 中的变量
- gulp - 使用 Gulp.src 复制隐藏文件夹
- reactjs - 如何在 React 项目中添加 p5.clickable 和 p5.gui 等 p5.js 社区库?
- javascript - React + Firebase:提交按钮未触发?
- ruby - Ruby on Rails 通过表单错误将对象添加到数据库