【问题标题】:Validate array with 2 values验证具有 2 个值的数组
【发布时间】:2020-10-19 10:31:50
【问题描述】:

我正在尝试验证一个数组是否有 2 个特定值,例如:

['foo', 'bar']

我觉得我最接近答案是这样的:

Yup.array()
  .of(Yup.mixed().oneOf(['foo', 'bar']))
  .min(2)
  .max(2)

但这也会通过['foo', 'foo']['bar', 'bar']

【问题讨论】:

  • Yup.mixed().oneOf([['foo', 'bar'], ['bar', 'foo']])?或者使用addMethod 添加您自己的方法并执行Yup.array().containsInAnyOrder(['foo', 'bar']) 之类的操作。
  • 我的小建议,不要将框架/库用于如此简单的任务。尝试使用纯 JavaScript 将大大提高您的技能。从 ES6 时代开始,js 就是这样的功能性东西的奇迹

标签: javascript arrays yup


【解决方案1】:

作为一个变体,您可以使用 Yup test 函数,它允许您使用当前字段值和另一个表单字段值进行操作。在这个例子中,我们检查字段值是否有重复,如['foo', 'foo'],然后检查是否没有重复或字段数组的每个值都包含foobar

Yup.array()
  .test('contains', 'Error message here', function (value) {
      let hasDuplicate = value.some((val, i) => value.indexOf(val) !== i);
      return !hasDuplicate && value.every(el => ['foo', 'bar'].includes(el));
   })
  .min(2)
  .max(2)

这里你可以找到更多关于test函数的信息:https://github.com/jquense/yup#mixedtestname-string-message-string--function-test-function-schema

【讨论】:

  • 这将允许任何长度为 2 的数组,其中一个值是 'foo''bar'
  • 但这是一个问题。它可以包含相同的值
  • 不,OP 明确表示这是他们现有实施的问题。你的也允许例如['bar', 'baz'],其中包含一个不应有效的元素。
  • 现在这个only和OP的实现有同样的问题。
  • ['foo', 'bar'].every(el => ['foo', 'bar'].includes(el)) 返回真。 ['foo', 'baz'].every(el => ['foo', 'bar'].includes(el)) 返回错误。有什么问题?
【解决方案2】:

你也可以为此编写一个函数。 我的理解是你正在寻找一个数组中的两个变量。 这是我尝试过的

function find(arr,first,second){
let temp=false;
if(arr.includes(first)&&arr.includes(second)){
temp=true;
}
return temp;
}

find(["foo","bar"],"foo","bar");

如果您正在寻找一个长度完全相同的数组,那么您也可以在函数中进行长度检查。 函数看起来像

function find(arr,first, second){
  let temp=false;
  if(arr.length!=2)
    return false
   if(arr.includes(first)&&arr.includes(second)){
   temp=true;
   }
  return temp;
}

find(["foo","bar"],"foo","bar");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2022-01-22
    • 2020-05-30
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多