【问题标题】:jQuery - Checking if array is empty or has attributesjQuery - 检查数组是否为空或具有属性
【发布时间】:2017-08-30 05:29:45
【问题描述】:

我得到一个字符串数组,如果数组有项目我想做一件事,如果没有我想做另一件事。我不确定如何检查数组是否为空。此外,在 chrome 调试器中单步执行我的代码时,即使数组中有项目,长度仍然为 0,所以我不能使用 formErrors.length > 0

这是我获取错误的代码。这工作正常并返回错误字符串数组或空数组:

var formErrors = validateFormData(formData);

function validateFormData(data) {
    var errors = [];

    if (data["title"].length == 0) {
        errors["title"] = "Project title required";
    }
    if (data["client"].length == 0) {
        errors["client"] = "Client name required";
    }
    if (data["date"].length == 0) {
        errors["date"] = "Date required";
    } else if (!isValidDateFormat(data["date"])) {
        errors["date"] = "Date format invalid - Format: dd/mm/yyyy";
    }
    if (data["status"] == "") {
        errors["status"] = "Please select current status for this project";
    }
    if (data["type"] == "") {
        errors["type"] = "Please select a project type";
    }
    if (data["extras"].length == 0) {
        errors["extras"] = "You must select at least one extra for this project";
    }

    return errors;
}

然后,如果没有错误,我想做一件事,如果有错误,我想做另一件事。但这一点对我不起作用。

if (formErrors !== {}) {
        displayFormErrors(formErrors);
        event.preventDefault();
    }
    else {

        clearForm();
    }

我尝试了多种方法,但到目前为止没有任何效果。感谢您的帮助,谢谢!

编辑

我不能在数组上使用 .length,因为即使它有数据,长度也是 0。

Screenshot of chrome debugger

我对人们在问什么感到有些困惑,抱歉,我不是专家,这里是我的完整代码,以便更好地了解我正在尝试做的事情。

$(document).ready(function () {

$('#submit').on("click", onSubmitForm);

function onSubmitForm(event) {
    clearErrorMessages();

    var formData = getFormData();
    var formErrors = validateFormData(formData);

    if (formErrors) {
        displayFormErrors(formErrors);
        event.preventDefault();
    }
    else {

        clearForm();

        // Do other stuff

    }
}

function clearForm() {
    $('#title').val("");
    $('#client').val("");
    $('#date').val("");

    $('#status').val("planning");

    $('#description').val("");

    $('.type').prop('checked', false);
    $('.extra').prop('checked', false);

    $('#title').focus();
}

function clearErrorMessages() {
    $(".uk-text-danger").html("");
}

function getFormData () {
    var data = [];

    data["title"] = $('#title').val();
    data["client"] = $('#client').val();
    data["date"] = $('#date').val();

    data["status"] = $('select#status option:selected').val();

    data["description"] = $('#description').val();

    if ($("input[name='type']:checked").length > 0) {
        data["type"] = $("input[name='type']:checked").val();
    }
    else {
        data["type"] = "";
    }

    data["extras"] = [];
    $.each($("input[name='extras[]']:checked"), function(index, radio) {
        data["extras"].push(radio.value);
    });

    return data;
}

function validateFormData(data) {
    var errors = [];

    if (data["title"].length == 0) {
        errors["title"] = "Project title required";
    }
    if (data["client"].length == 0) {
        errors["client"] = "Client name required";
    }
    if (data["date"].length == 0) {
        errors["date"] = "Date required";
    } else if (!isValidDateFormat(data["date"])) {
        errors["date"] = "Date format invalid - Format: dd/mm/yyyy";
    }
    if (data["status"] == "") {
        errors["status"] = "Please select current status for this project";
    }
    if (data["type"] == "") {
        errors["type"] = "Please select a project type";
    }
    if (data["extras"].length == 0) {
        errors["extras"] = "You must select at least one extra for this project";
    }

    return errors;
}

function displayFormErrors(errors) {
    for (var field in errors) {
        var errorElementId = field + "Error";
        $('#' + errorElementId).html(errors[field]);
    }
} });

对不起,如果这太多了,我不知道还能做什么。

【问题讨论】:

  • 只使用 if(array_name.length == 0){/* 做某事 */}
  • 你应该展示一下你的数组是什么样子的。
  • 为什么需要 formerrors 数组?您在数组中插入一个数组,然后检查第二个数组?这没有意义..只需检查错误[] 你不需要 formErrors
  • 我不太确定你在问什么,我已经添加了我所有的代码来尝试更好地理解。

标签: javascript jquery arrays forms


【解决方案1】:

空数组、字符串或对象在 JavaScript 中是“falsy”。

也就是说,您可以将数组、字符串或对象直接传递到 if 条件中,它会根据是否有东西运行。

if ([]) {
  // this will never run
}
if ('') {
  // this won't run either
}
if ({}) {
  // nor will this
}

【讨论】:

  • 嗯不完全是.. var a = []; a.stg = "something", if (a) console.log("yes") // <- yes; a == true; // <- false a == false // <- true a === false // <- false a === true // <- false a ? true : false // <- true
【解决方案2】:

var errors = {};validateFormData function 内。 然后像这样比较对象。

if (JSON.stringify( formErrors ) !== '{}') { //do something}else { //do something}

【讨论】:

  • 这似乎奏效了,但我不确定如何!无论如何谢谢:)
  • 您所做的错误是,您将变量 errors = [] 声明为数组并尝试与这样的对象进行比较 if (formErrors !== {})。
  • 您不能像这样比较对象,例如 formErrors !== {} 而是必须使用 JSON,stringify 将对象转换为字符串。
【解决方案3】:

您在哪里验证formErrors 是否为空?这个验证(if-else)应该在提交表单的函数内部。

也尝试使用:

如果 (formErrors.length > 0)

代替:

if (formErrors !== {})

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 2014-05-16
    • 2014-05-06
    • 2012-03-19
    • 2017-12-26
    • 1970-01-01
    • 2011-03-26
    • 2013-07-03
    相关资源
    最近更新 更多