性格悪い人が優勝

nullではない変数が2つ以上という条件分岐を書きたいのですが、どう書けばよいでしょうか?

hoge1
hoge2
hoge3
hoge4

A 回答 (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 などを使えば類似の記述ができます。
    • good
    • 0
この回答へのお礼

回答ありがとうございました

>reduce
・初めて知りました
・これは便利ですね
・色々応用が利きそうだし、これから使っていこうと思いましたー

お礼日時:2013/07/23 07:10

「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つ以上」なんかもあり得るし、変数増減しても修正しやすいし。
    • good
    • 0
この回答へのお礼

回答ありがとうございました

>素直にnull出ない変数の数を数えて、その数で分岐
・そうですね
・質問した時点では難しく考えていましたが、実際にコードを見てみたら、素直に書いた方が早いかも、と思いました

お礼日時:2013/07/23 07:06

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
    • good
    • 0
この回答へのお礼

回答ありがとうございました

>ビット処理で
・発想にびっくりしました
・こういう考え方もあるのか、と思いました
・面白かったです

お礼日時:2013/07/23 07:00

こんにちは。



一つずつカウントしても良いと思いますが、面倒ですので以下のような関数を作成しました。

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];
}
    • good
    • 0
この回答へのお礼

回答ありがとうございました

>arguments.length
・初めて知りました
・大変参考になりましたー

お礼日時:2013/07/23 06:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!