【问题标题】:How can I test if all values in an associative array are true? (Javascript)如何测试关联数组中的所有值是否为真? (Javascript)
【发布时间】:2015-11-25 18:23:37
【问题描述】:

关联数组:

var signUpStates = {
    "CNPJ": false,
    "PASSWORDS": false,
    "ADDRESS": false,
    "GENERAL_FIELDS": false,
    "TERMS": false,
}

我的尝试:

function updateButton() {
    var tempArray = []
    $.each(signUpStates, function(i, val) {
        tempArray.push(val);
    });
    if(tempArray.every(function(e, i, a) { return e == true; })) {
        $(".btn-cadastrar-fornecedor").attr('disabled', false);
    } else {
        $(".btn-cadastrar-fornecedor").attr('disabled', true);
    }
}

遍历它并单独检查是行不通的。进行此类测试的最佳方法是什么?

【问题讨论】:

  • 应该有一个.all() 函数,这取决于你使用的是哪个库
  • 在 JavaScript 中,我们只称它们为对象。
  • 您应该考虑通过设置其位置来声明您的数组对象,例如 signUpStates = [], cnpj[0] = false, passwords[1] = false。

标签: javascript logic


【解决方案1】:

最直接的解决方案(如果您询问逻辑)是使用 for 循环:

var is = true;

for (var key in signUpStates) {
    if (!signUpStates[key]) {
        is = false;
        break;
    }
}

严格来说,正确的方法也是只检查自己的属性,如果您正在测试的对象可能从其他对象继承属性,这一点很重要:

var is = true;

for (var key in signUpStates) {
    if (signUpStates.hasOwnProperty(key) && !signUpStates[key]) {
        is = false;
        break;
    }
}

在像您这样的简单情况下,不需要此额外检查。

【讨论】:

  • 可能值得一提的是hasOwnProperty。不过,鉴于 OP 的代码,没有必要。并且 +1,有时旧方法是最好的。
  • 是的,我考虑过 hasOwnProperty 但在 OP 的情况下没有必要。但是,是的,最好提一下。
【解决方案2】:

可以从Object.keys获取对象的属性名数组,然后使用Array#every

if (Object.keys(signUpStates).every(function(name) { return signUpStates[name]; })) {
    // All are true
} else {
    // Not all are true
}

使用 ES2015(又名 ES6)的箭头函数,这会变得更短:

if (Object.keys(signUpStates).every(name => signUpStates[name])) {
    // All are true
} else {
    // Not all are true
}

对 ES2015 的支持仍然相对较少,特别是如果您必须处理在规范最终确定之前发布的浏览器,所以如果这是针对一般网页,您不会使用它们或使用转译器.如果这是针对 NodeJS 的,您可以直接在 v4 及更高版本中使用它们。

【讨论】:

  • @ZohaibIjaz:远非如此,我认为(但可能不应该)人们知道这一点。我使用转译。
猜你喜欢
  • 2016-02-10
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
相关资源
最近更新 更多