2017-02-21 7 views
0

すべての条件に対して関数checkEmpty()を呼び出さなければならないifステートメントがあります。条件1が偽である場合複数のブール条件のステートメント・チェック

function checkFormFilled(evt){ 
    var isFilled; 
    if(checkEmpty('id1', 'class1') && //condition 1 
     checkEmpty('id2', 'class2') && //condition 2 
     checkEmpty('id3', 'class3') && //condition 3 
     checkEmpty('id4', 'class4')){ //condition 4 
     evt.preventDefault(); 
     isFilled = true; 
    } 
    return isFilled; 
} 

問題は、(いずれかの条件が偽である)であり、evt.preventDefault()線へスキップcheckEmpty()関数は、以下の他の呼び出しません。

すべての条件がtrueを返す場合は、evt.preventDefault()を呼び出す必要があります。

別の方法でこの作業を行うことはできますか?

+1

、問題は何ですか? – Nicolas

+0

最初の条件1がfalseの場合は、evt.preventDefault()行にスキップします。 evt.preventDefault()行を呼び出す前に、4つの条件すべてを呼び出す必要があります。 – haeminish

+0

これは、AND演算子が最初のfalseの後に閉じるためです。 OR演算子が必要です。 – Nicolas

答えて

3

は、条件の少なくとも一方がFalseの場合、それはIFブロック内に入ることはありませんがOR

1

論理演算子||を試してみてください。複数の& &ステートメントの場合、FALSEを受け取ると、それ以降の他のすべての& &ステートメントはもうチェックされず、FALSEが返されます。

0

その短絡と呼ばれる。

1- & &で構成される条件チェックでは、最初の要素がfalseと評価された場合、残りの条件はすべて無視され、条件全体に対してfalseが返されます。

2- ||で構成される条件チェックでは、最初の要素が真と評価された場合、残りの条件はすべて無視され、条件全体に対して真を返します。


彼が編集しました。これはもはや真実ではありません。私はコミュニティウィキを作っています、ここに滞在してください。

||を使用するか、条件チェックでサブ条件の順序を変更して、必要なときに他の要素がテストされるようにすることをお勧めします。

1

場合

は、すべての条件のため機能checkEmpty()を呼び出す必要があります。

そして

私はすべての条件がtrueを返すときevt.preventDefault()を呼び出したいです。

function checkEmpty(x) { 
    console.log('checkEmpty called for ' + x); 

    return false; 
} 
if(checkEmpty('..1', '....') & //condition 1 
    checkEmpty('..2', '....') & //condition 2 
    checkEmpty('..3', '....') & //condition 3 
    checkEmpty('..4', '....')){ //condition 4 
    console.log('inside if'); 
} 

出力:

checkEmpty called for ..1 
checkEmpty called for ..2 
checkEmpty called for ..3 
checkEmpty called for ..4 

fiddle demo hereを参照してくださいあなたはcheckEmpty()はブール値を返すことが確実な場合

は、あなたがbitwise and (&)演算子を使用することができます。

+0

注意: 'checkEmpty()'が 'true'や' false'以外のものを返す可能性がある場合は、ビット演算子であるので '&'を使わないでください。例: '1&10'は' 0'を返します。これは 'truey && truthy'が' true'なので論理演算子であれば期待しないものです。 – acdcjunior

+0

OTOH、 'checkEmpty()'が常にブール値を返すかどうかわからない場合は、それらを二重にすることができます: 'if(!! '1'、 '....')&!! checkEmpty ( '..2 '、' .... ')...'(すべての 'checkEmpty()'呼び出しの前に '!!'が追加されていることに注意してください)。 – acdcjunior

0

チェーンされた&&オペレータで現在何をしているのかは、これらのすべてが真の場合はevent.preventDefaultとなります。すべての条件を確認して、真が当てはまる場合は、論理OR演算子||を代わりに使用する必要があります。

0

オブジェクトの配列があると仮定すると、every関数を試すことができます。

例あなたは何をしているかを正確だ

var array = []; 
 

 
for (var i = 0; i < 4; i++) 
 
{ 
 
    array.push({ 
 
    id: i, bool: true 
 
    }); 
 
} 
 

 
function check(item) 
 
{ 
 
    return item.bool == true || false; 
 
} 
 

 
if (array.every(check)) 
 
{ 
 
    console.log("all true"); 
 
} 
 
else 
 
{ 
 
    console.log("return false instead"); 
 
} 
 

 

 

 
// Just an example of something that is false 
 
array[1].bool = false; 
 

 
if (!array.every(check)) 
 
{ 
 
    console.log("something is false"); 
 
}

関連する問題