- ベストアンサー
条件分岐 … nullではない変数が2つ以上
nullではない変数が2つ以上という条件分岐を書きたいのですが、どう書けばよいでしょうか? hoge1 hoge2 hoge3 hoge4
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ES5/JS1.8 に限定ですが、以下がお勧めです。 var counter = function(a, b){ return b !== null? a+1: a }; if ([hoge1, hoge2, hoge3, hoge4].reduce(counter, 0) >= 2) { // null でない変数が二つ以上の処理 } 昔の環境でも jQuery などを使えば類似の記述ができます。
その他の回答 (3)
- neKo_deux
- ベストアンサー率44% (5541/12319)
「nullではない変数が2つ以上」ならば、素直にnull出ない変数の数を数えて、その数で分岐とか。 int iNotNull = 0; if (hoge1!=null) {iNotNull++;} if (hoge2!=null) {iNotNull++;} if (hoge3!=null) {iNotNull++;} if (hoge4!=null) {iNotNull++;} if (2<=iNotNull) {処理;} -- if (hoge1!=null && hoge2!=null) || (hoge1!=null && hoge3!=null) || … とかって書き方もありますが、この仕様の書きっぷりだと「2つ以上→3つ以上」なんかもあり得るし、変数増減しても修正しやすいし。
お礼
回答ありがとうございました >素直にnull出ない変数の数を数えて、その数で分岐 ・そうですね ・質問した時点では難しく考えていましたが、実際にコードを見てみたら、素直に書いた方が早いかも、と思いました
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
1つずつnullかどうかを判断してカウントを取るか、 もしくはとにかく一発で取りたいのか?と思って、 こんなのを作ってみました。 <html> <head> <script type="text/javascript"> function OnLoad() { var hoge1 = null; // ビット処理で、trueは1 var hoge2 = null; // ビット処理で、trueは2 var hoge3 = "a"; // ビット処理で、trueは4 var hoge4 = null; // ビット処理で、trueは8 var result = ((hoge1 != null) | (hoge2 != null) << 1 | (hoge3 != null) << 2 | (hoge4 != null) << 3); if (result <= 2 || result == 4 || result == 8) { alert("null以外が1つしかない:" + result); } else { alert("null以外が2つ以上ある:" + result); } } </script> </head> <body onload="OnLoad()"> </body> </html> 2進数表現での対象・対象外 0000 × 0 0001 × 1 0010 × 2 0011 ○ 3 0100 × 4 0101 ○ 5 0110 ○ 6 0111 ○ 7 1000 × 8 1001 ○ 9 1010 ○ 10 1011 ○ 11 1100 ○ 12 1101 ○ 13 1110 ○ 14 1111 ○ 15
お礼
回答ありがとうございました >ビット処理で ・発想にびっくりしました ・こういう考え方もあるのか、と思いました ・面白かったです
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 一つずつカウントしても良いと思いますが、面倒ですので以下のような関数を作成しました。 checkにチェックしたい変数をつらつら渡してあげて2以上nullではない変数があった場合はtrueを返します。 第一引数はnull以外の変数の数を指定できます。 (1にすれば1つ以上のnull以外でtrueを返します) var hoge1 = null; var hoge2 = 3; var hoge3 = 3; var hoge4 = null; alert ( check( 2, hoge1, hoge2, hoge3, hoge4 ) ); function check() { var cntNull = 0; for ( var i = 1; i < arguments.length + 1; i ++ ) { if ( arguments[i] != null ) { cntNull ++; } } return cntNull >= arguments[0]; }
お礼
回答ありがとうございました >arguments.length ・初めて知りました ・大変参考になりましたー
お礼
回答ありがとうございました >reduce ・初めて知りました ・これは便利ですね ・色々応用が利きそうだし、これから使っていこうと思いましたー