JavaScriptの配列に値が含まれているかどうかを調べるのに、最も簡潔で効率的な方法は何ですか?
私が知っている限りでは、この方法しかありません。
function contains(a, obj) {
for (var i = 0; i < a.length; i++) {
if (a[i] === obj) {
return true;
}
}
return false;
}
もっと簡潔で良い方法はありませんか?
これはStack Overflowの質問Best way to find an item in a JavaScript Array?と非常に密接な関係があり、indexOf
を使って配列内のオブジェクトを見つけることを取り上げています。
**2019年からの更新:この回答は2008年(11年前!)のもので、現代のJSの使い方には関係ありません。約束されたパフォーマンス向上は、当時のブラウザで行われたベンチマークに基づいています。現代のJS実行コンテクストには関係ないかもしれません。簡単な解決策が必要であれば、他の答えを探してください。最高のパフォーマンスが必要な場合は、関連する実行環境で自分でベンチマークを行ってください。
他の方もおっしゃっていますが、配列の反復処理はおそらく最良の方法ですが、JavaScriptで反復処理を行うには、減少するwhile
ループが最速であることが証明されていますされています。そこで、コードを以下のように書き換えてみてはいかがでしょうか。
function contains(a, obj) {
var i = a.length;
while (i--) {
if (a[i] === obj) {
return true;
}
}
return false;
}
もちろん、Array prototypeを拡張してもいいでしょう。
Array.prototype.contains = function(obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
}
そして、今度は単純に次のようにします。
alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false
indexOf
かもしれませんが、「ECMA-262規格に対するJavaScriptの拡張であり、そのため他の規格の実装には存在しない可能性がある」とのことです。
例
[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1
AFAICS Microsoftはこれに代わる何らかの機能を提供していませんが、その気になれば、Internet Explorer(およびindexOf
をサポートしていない他のブラウザ)でも配列に同様の機能を追加することができます(簡単なGoogle検索で明らかになりました)(例えばこちら)。