仅当所有数组元素相同时才执行函数

时间:2012-11-29 04:40:22

标签: javascript

我有一个带布尔值的数组:

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
   }
}

5 个答案:

答案 0 :(得分:8)

答案 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
}