如何测试关联数组中的所有值是否为真? (Javascript)
How can I test if all values in an associative array are true? (Javascript)
关联数组:
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);
}
}
遍历它并单独检查是行不通的。进行此类测试的最佳方法是什么?
您可以从 Object.keys
, and then use 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 及更高版本中使用它们。
最直接的解决方案(如果您询问的是逻辑)是使用 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;
}
}
在像您这样的简单情况下,不需要这种额外的检查。
关联数组:
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);
}
}
遍历它并单独检查是行不通的。进行此类测试的最佳方法是什么?
您可以从 Object.keys
, and then use 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 及更高版本中使用它们。
最直接的解决方案(如果您询问的是逻辑)是使用 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;
}
}
在像您这样的简单情况下,不需要这种额外的检查。