JavascriptでPHPの「isset」のやり方~配列メンバ名の有無を判断する~
Javascriptの配列ででハッシュを使用することはできます。
(詳しくは以下の記事を参照いただければ幸いです。)
意味のあるパラメータなど配列にして保存しておけば、メンテナンスや修正の際のミスを減らしやすい特性があります。なぜならば、ハッシュ(メンバ名)を見れば、目視で意味がわかるためです。
ところが今回Javascriptで、以下のような処理が必要になりました。
- ハッシュ(メンバ名)が存在する場合はその値を取得
- ハッシュ(メンバ名)が存在しない場合は処理をスルー
まず思ったことは、
ハッシュの存在あり・なしをJavascriptで判定できるの?
ということでした。
答えは「できます。」
いつものようにググり、試して見ましたので、忘備録として記録いたします。
やりたいこと:PHPで言うところの「isset()」判定をJavascriptで行いたい。
PHPには、配列のメンバ名が存在しているかどうかを判定する関数があります。
それがisset()関数です。
以下のように使用します。
※以下の例では「else」判定(メンバ名なし)になります。
1 2 3 4 5 6 7 8 9 10 |
$para = array("a"=>1, "b"=>2, "d"=>4); if (isset($para["c"]) == true) /* メンバ名「c」あり ? */ { /** メンバ名が存在する場合の処理 */ } else { /** メンバ名が存在しない場合の処理 */ } |
isset()関数に、メンバ名を含めた記述をすると、
メンバ名が存在する場合は true
メンバ名が存在しない場合は false
が戻り値になります。
このようにPHPだと判定関数があるので簡単です。
これをJavascriptで実行するにはどうすればよいのでしょうか?
Javascriptでisset同様の処理を行う方法
PHPでのissetをJavascriptで実現するには、以下のように記述します。
上記のPHPソースは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<script> var $para = []; $para["a"] = 1; $para["b"] = 2; $para["d"] = 4; if (("c" in $para) == true) { // メンバ名が存在する場合の処理 } else { // メンバ名が存在しない場合の処理 } </script> |
疑問:(“c” in $para)とはなんぞや?
何やら見慣れない記述です。
意味は「$paraの中に”c”というメンバ名はありますか?」
というようなことです。
クセのある記述ですが、Javascriptの記述方法といえば記述方法です。
ただこれがphpのisset()と同じことをします。
存在する場合はtrueが返ります。
存在しない場合はfalseが返ります。
tureとfalseで判断できるため、白黒はっきりしています。
意味合いで記述すると以下のようになります。
(”メンバ名” in 配列名)
関数ではないため、少々わかりにくいですが、Javascriptではこのようにします。と理解します。
さらにこのような方法もありますが、注意も必要です
in を使用する方法のほかに、以下のような記述方法もあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<script> var $para = []; $para["a"] = 1; $para["b"] = 2; $para["d"] = 4; if ($para["c"]) { // メンバ名が存在する場合の処理 } else { // メンバ名が存在しない場合の処理 } </script> |
メンバ名をif文に記述すればそれだけで、メンバ名が存在するかどうかを判断できます。
ただしこの方法は以下の場合誤動作します
こんな便利な方法があるなら、これでいいのではないのか?
と思います。
でも、この方法には欠点があります。
以下のような場合、本来は「メンバ名あり」なのですが、「メンバ名無し」になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<script> var $para = []; $para["a"] = 1; $para["b"] = 2; // メンバ名"c"を作る $para["c"] = 0; $para["d"] = 4; if ($para["c"]) { // メンバ名が存在する場合の処理 } else { // メンバ名が存在しない場合の処理 } </script> |
メンバ名”c”が存在していても、中身が0の場合、0はfalseという判定になります。
このケースisset関数ならばメンバ名が存在するになります。
なので、in の記述を使用します。
(“c” in $para) であれば、値に0が入っていても、メンバ名ありという判定になります。
厳密に判断するためにも、inを使用したほうがよさそうです。
JavascriptはPHPと似て非なる言語
JavascriptもPHPもC言語ベースでその記述の見た目は似ています。
ただ、細かな判定や関数が大きく異なります。
このあたりがPHP慣れしていると、とっつきにくく感じたりします。
そもそもJavascriptはブラウザ上の見た目を操作するための言語で、PHPはサーバーで動く処理言語です。
用途が異なる言語のため、似て非なる言語なのは仕方がないことなのかもしれません。
こればっかりは慣れるしかないようです。
また本記事がお役に立てば幸いです。