配列にある値が存在するかどうかをfor文を使わずに調べる方法を考えてみた
先にお断りしておきますが、この方法は厳密ではないので数値と文字列など型を区別して存在確認したい場合には使えません。また速度やメモリ消費という意味で実用に耐えるかどうかもわかりません。こういうこともできるなー程度に読んでください(^_^;)
2013/1/25追記。より正攻法で存在確認を行う方法を整理した記事を書きました→Javascriptで配列にある値が存在するかどうかを確認する方法について
Javascriptの配列にはある値が存在するかどうかをチェックするメソッドが組み込みでは用意されていません。またJavascriptの"if in"はオブジェクトのプロパティの存在を確かめる書き方で、配列の値は調べられないので自力で処理を書くか、ライブラリなどを使う必要があります。
自力で書くとすれば配列のメソッドとして書くか処理自体をベタで書くかの違いはあれど普通はfor文を使って書くことになると思います。
//メソッドを追加する Array.prototype.contain = function(value){ for(var i = 0; i < this.length; i++){ if(this[i] === value){ return true; } } return false; }; var a = ["ABC","BCD","こんにちは","3.14"]; if(a.contain("こんにちは")){ window.alert("ある!"); }
//ベタ書き var a = ["ABC","BCD","こんにちは","3.14"]; for(var i = 0; i < a.length; i++){ if(a[i] === "こんにちは"){ window.alert("ある!"); break; } }
そして他のやり方ないかなーと考えていて思いついたのがこちら。(既知の方法かもしれませんが)
var a = ["ABC","BCD","こんにちは","3.14"]; if(a.join().match("こんにちは") ){ window.alert("ある!"); }
"join()"ですべての要素を結合した文字列を作ってそれを正規表現で探索するわけです。ただし上の書き方のままだと"こんにち"などの要素の一部に含まれる文字列も存在することになってしまうので実際に使うなら以下のように書けばいいかなと思います。
var a = ["ABC","BCD","こんにちは","3.14"]; if(("," + a.join() + ",").match("," + "こんにちは" + ",")){ window.alert("ある!"); }
"join()"で得た文字列の先頭とお尻に","を付けておいて、それの","の間を検索するようにするわけです。これならば"こんにち"や"AB"にはマッチしないようにできます。
そもそも探索したい配列の値に","を含んでいる可能性がある場合は
var a = ["ABC","BCD","こんにちは","3.14","コンマを,含む"]; if(("|" + a.join("|") + "|").match("|" + "コンマを,含む" + "|") ){ window.alert("ある!"); }
のように他の区切り文字を使えば一応対応できます。
この方法の一番の問題は冒頭でも書いたように型を区別することができなくなってしまうことなのですが、その必要がないことがあらかじめ分かっている場合には
("," + array.join() + ",").match("," + "hoge" + ",")
という式のみで書けるという点でひょっとしたら使いどころがあるかもしれないと思っています。
・・・ないかな(^_^;)