【问题标题】:Improving readability of multiple if statements with common pattern提高具有通用模式的多个 if 语句的可读性
【发布时间】:2019-04-29 20:19:01
【问题描述】:

我正在做一些 JavaScript 前端,我有大量的表单,所有这些都需要验证。截至目前,我正在使用这种结构:

function validateForm() {
    let form = document.forms["form-add-consumer"];

    let id = form["input-id"].value;
    let lastName = form["input-last-name"].value;
    let firstName = form["input-first-name"].value;
    ...

    let missing = false;
    if (lastName.trim() === "") {
        document.getElementById("input-last-name-error").className = "error";
        missing = true;
    }
    if (firstName.trim() === "") {
        document.getElementById("input-first-name-error").className = "error";
        missing = true;
    }

    if(missing){
        return false
    } else {
        return buildRequest(id, firstName, lastName, ...);
    }
}

如您所见,对于大型表单,该功能将快速增长。每个字段的代码有点多余:

  1. 声明表单域
  2. 根据布尔条件检查其值
  3. 如果布尔值失败,则显示错误标签并将失败的布尔值设置为 true 以不发送请求

我怎样才能改进这段代码而不使其过于复杂(如果可能,不要使用库)?

【问题讨论】:

  • 使用 HTML 表单验证似乎可以为自己省去很多麻烦:developer.mozilla.org/en-US/docs/Learn/HTML/Forms/…
  • @MarkMeyer 谢谢!这似乎是一个不错的选择。我显然无法在自定义表单元素和旧版浏览器中完全使用它,但知道它仍然是一件很棒的事情!

标签: javascript readability


【解决方案1】:

也许您可以创建一个包含每个字段验证器的对象,并为各个字段提供选择器,以便您可以以更简洁的方式执行必要的验证,如下所示:

function validateForm() {
    let form = document.forms["form-add-consumer"];

    let id = form["input-id"].value;
    let lastName = form["input-last-name"].value;
    let firstName = form["input-first-name"].value;
    ...

    // Construct an object with selectors for the fields as keys, and 
    // per-field validation functions as values like so
    const fieldsToValidate = {
      '#input-id' : value => value.trim() !== '',
      '#input-last-name' : value => value.trim() !== '',
      '#input-first-name' : value => value.trim() !== '',
      ...,
      '#number-field' : value => parseInt(value) > 0, // Different logic for number field
      ...
    }

    const invalidFields = Object.entries(fieldsToValidate)
    .filter(entry => {

        // Extract field selector and validator for this field
        const fieldSelector = entry[0];
        const fieldValueValidator = entry[1];
        const field = form.querySelector(fieldSelector);

        if(!fieldValueValidator(field.value)) {
            // For invalid field, apply the error class
            field.className = 'error'
            return true;
        }

        return false;
    });

    // If invalid field length is greater than zero, this signifies
    // a form state that failed validation
    if(invalidFields.length > 0){
        return false
    } else {
        return buildRequest(id, firstName, lastName, ...);
    }
}

【讨论】:

  • 谢谢,但它只有在唯一的条件是不为空的情况下才有效。我的错我没有突出显示它并且示例没有显示它,但是对于某些字段我需要检查其他条件(大于,不是某个值,...)
  • @Dranna 刚刚做了一些更新来回答 - 这对你有帮助吗?
  • 谢谢,我调整它以选择标签错误字段(通过使用选择器+'-error')并且它有效。我不确定它是否有助于提高可读性,但它减少了验证之间的可变性和代码行数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多