根据验证设置对象的值

时间:2020-05-22 10:09:22

标签: javascript

我正在尝试根据值是否有效来更新validations

如果我使用validations.isValid = false进行设置,

在函数内将validations.isvalid显示为false,在函数外显示true,如果值验证失败,如何将其正确设置为false?

export let validations = {
  validate: null,
  isValid: true,
  validationMessage: ''
};

export let validationsOptions = {
  shouldValidateUniquness: true
};

function validateInput(value, validationRules) {
  let options = {
    ...validations
  }
  switch (validationRules) {
    case 'day':
    case 'month':
    case 'date':
    case 'year':
      validateDate(value)
      break;
    case 'notEmpty':
      if (value == null || value.length === 0) {
        options = {
          ...validations,
          isValid: false
        }
        // Object.assign(validations,{...validations, isValid: false})
        // validations.isValid = false
      }
      break;
    case 'phone':
      if (value == null || value.length === 0 || !(new RegExp(/^(\(?\+?[0-9]*\)?)?[0-9_\- \(\)]*$/).test(value))) {}
      break;
    case 'numbersOnly':
      if ((value !== null && value !== '') && !(new RegExp(/^\d+$/).test(value))) {
        validations.isValid = false;
      }
      break;
    case 'email':
      if (!validateEmailFormat(value)) {
        options = false;
      }
      break;
    case 'minLength':
      if (value.length < minLength) {
        validations.isValid = false;
      }
      break;
  } {
    console.log(options)
  }
  return options
}

1 个答案:

答案 0 :(得分:0)

严格回答您的要求:

您不想要

  let options = {
    ...validations
  }

但是

  // now modifying options does modify validations as well since they refer to the same object
  const options = validations 

那是一种不好的做法,因为您会引起副作用(即,在功能之外的验证中。有点像全局变量(然后将其导出!))。

如果您希望修改validations,则可以将其作为参数传递,并“就地”对其进行修改。

function validateInput(value, validationRules, options = {
  validate: null,
  isValid: true,
  validationMessage: ''
}) {
  ... //
  return options
}
const myOptions = { validate: null, isValid: true, validationMessage: '' }
const out = validateInput(.., .., myOptions)
// myOptions will be modified
// you can also access it via variable out
  • 如果呼叫者未提供选项,您将获得一个新实例
  • 如果他这样做了,您可以修改他给的选项

如有必要,为选项(???)设置一个单例,但将该实例分配给validateInput,因此造成厄运的原因不是validateInput而是单个实例的赋予。 / p>


最后,还是无法实现:您的函数仍然有副作用(根据您的要求),以防万一请记住,不修改选项(作为参数)并返回一个新实例将使您的函数是纯函数,并且由于没有副作用,因此您可以随时随地调用它。