我有一个带布尔值的数组:
var array = [false, false, false];
我想只在所有元素都是false
时才执行函数。
我试过这个并没有用,因为它会为每个false
执行函数:
for(var i = 0; i < array.length; i++){
if(array[i] === false){
functionA(); //This function ran at every false
}else{
//Do something else
}
}
答案 0 :(得分:8)
if (array.indexOf(true) == -1) {
functionA();
}
答案 1 :(得分:1)
您可以执行以下操作:
function checkAllSameValue(array) {
var identical = true;
var i = 0;
while ((i + 1) in array && identical) {
identical = array[i] == array[++i];
}
return identical;
}
检查每个成员是否与下一个成员相同
为了回应ilia choly关于性能和查找的问题,这里有一个与for循环一样快的替代方案,可能更快,具体取决于UA:
function checkAllSameValue(array) {
var i = array.length;
var value = array[--i];
while (i) {
if (arr[--i] != value) return false
}
return true;
}
是否应使用==
或===
取决于OP。所发布的解决方案都不涉及稀疏数组,因此没有一个是通用解决方案。
答案 2 :(得分:0)
这将有助于:
var array = [false, false, false];
var flag = true;
for(var i = 0; i < array.length; i++){
if(array[i]!= false){
flag = false;
break;
}
}
if(flag){
functionA(); //This function call function only once
}
答案 3 :(得分:0)
史蒂夫的方式更好,但如果你打算使用你的方法,那就是
var allFalse = true, i;
for(i = 0; i < array.length; i++) {
if(array[i]){
allFalse = false;
break;
}
}
if (allFalse) {
functionA();
}
或
if (array.every(function(val) { return !val; })) {
functionA();
}
如果你想要一个通用函数检查所有元素是否相同,你可以这样做
function checkAllSameValue(array) {
var first = array[0], i;
for (i = 1; i < array.length; i++) {
if (array[i] !== first) return false;
}
return true;
}
答案 4 :(得分:0)
您描述它的方式与标题略有不同。如果你只是尝试执行该功能,如果它们都是假的,那么史蒂夫的答案很棒。根据这个数组来自哪里,我可能会像这样扩展它,但要保守它:
if (array.indexOf(true) == -1 && array.indexOf(null) == -1) {
functionA();
}
OTOH,如果你想在任何时候都运行它,那么你需要更复杂的逻辑。
在这种情况下,我可能会设置一个标志,在循环中更新它,然后在循环后执行函数调用。您还需要一个变量来跟踪以前的值。如果任何值与其先前值不匹配,则它们不完全相同,因此您将标志设置为false。然后,在循环之后,检查标志并运行该函数,如果它是真的。
这样的事情:
var runFunction = true;
var previousVal = -1;
for (var i = 0; i < array.length; i++){
if(previousVal === -1) {
previousVal = array[i];
}
if(array[i] !== previousVal){
runFunction = false;
break;
}
}
if (runFunction) {
functionA();
} else {
// Do something else
}