1

ブール値を持つ配列があります:

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

5 に答える 5

8
if (array.indexOf(true) == -1) {
    functionA();
}

このindexOf関数は、特定の要素が配列内で見つかる最初のインデックスを返します。存在しない場合は-1を返します。

于 2012-11-29T04:42:34.560 に答える
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次第です。投稿されたソリューションはどれもスパース配列を扱っていないため、一般的なソリューションはありません。

于 2012-11-29T04:49:38.530 に答える
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
}
于 2012-11-29T04:45:57.560 に答える
0

Steve の方法の方が優れていますが、あなたのアプローチを使用する場合は、

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;
}
于 2012-11-29T04:46:04.917 に答える
0

説明の仕方がタイトルとは少し異なります。それらがすべてfalseの場合にのみ関数を実行しようとしている場合、Steveの答えは素晴らしいです. この配列がどこから来たのかにもよりますが、防御的にするために、おそらく次のように展開します。

if (array.indexOf(true) == -1 && array.indexOf(null) == -1) {
    functionA();
}

OTOH、それらがすべて同じであるときにいつでも実行したい場合は、より複雑なロジックが必要になります。

その場合、おそらくフラグを設定し、ループ内で更新してから、ループの後で関数呼び出しを行います。前の値を追跡するための変数も必要です。前の値と一致しない値がある場合、それらはすべて同じではないため、フラグを false に設定します。次に、ループの後、フラグを確認し、true の場合は関数を実行します。

このようなもの:

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
}
于 2012-11-29T04:58:03.557 に答える