Java と JavaScript で配列やリストや連想配列 (マップ) に値があるか調べる記法の比較

TL; DR

オブジェクトに対して、指定の値が存在すれば true を返してくれるようなメソッド類を調べた。

Object Java JavaScript
Array Arrays.AsList(array).contains(value) Array#includes(value)Array#indexOf(value) >= 0
List List#contains(value) -
Key in Map Map#containsKey(key) Key in Map
Value in Map Map#containsValue(value) #values() … 自作関数 Map.prototype.values().indexOf(value) >= 0

Java で配列に特定の値があるか

String[] array = { "hoge", "fuga", "foo", "bar" };

// Arrays#asList() で List に変換し、List#contains() を使う
if(Arrays.asList(array).contains("hoge")) {
  // "hoge" があったよ
}

Java でリストに特定の値があるか

上述のとおり List#contains() が使える。内部的には List#indexOf() を使っているようだ。

List<String> list = new ArrayList<String>();
list.add("hoge");
list.add("fuga");
list.add("foo");
list.add("bar");

if(list.contains("hoge")) {
  // "hoge" があったよ
}

if(list.indexOf("fuga") >= 0) {
  // "fuga" があったよ
}

if(list.indexOf("something") < 0) {
  // #indexOf() は値がないときは -1 を返すから、この場合は "something" がなかったよ
}

Java でマップに特定のキーがあるか

Map<String, String> map = new HashMap<String, String>();
map.put("Apple", "りんご");
map.put("Tangerine", "みかん");
map.put("Peach", "もも");

if(map.containsKey("Apple")) {
  // Map 中に "Apple" というキーがあるよ
}

Java でマップに特定のデータ (Value) があるか

キーではなく値の方の存在チェック。

Map<String, String> map = new HashMap<String, String>();
map.put("Apple", "りんご");
map.put("Tangerine", "みかん");
map.put("Peach", "もも");

if(map.containsValue("もも")) {
  // Map 中に "もも" というデータがあるよ
}

JavaScript で配列に特定の値があるか

JavaScript の配列とリストはほぼ同義なのでこれで。

// Java の配列は {} で囲むけど JavaScript は [] なんだよね…よく間違える
var array = [ "hoge", "fuga", "foo", "bar" ];

if(array.includes("foo")) {
  // 配列に "foo" があるよ
}

if(array.indexOf("fuga") >= 0) {
  // #indexOf() でも "fuga" があることが分かるよ
}

Array.prototype.includesArray.prototype.indexOf がないブラウザの場合は、自分で追加すれば使える。以下に代替コードが紹介されているのでどうぞ。

JavaScript で連想配列に特定のキーがあるか

連想配列。オブジェクト。ハッシュ。マップ。どれもだいたい同じ。

var hash = {
  "Apple": "りんご",
  "Tangerine": "みかん",
  "Peach": "もも"
};

// in という演算子で分かる
if("Peach" in hash) {
  // Hash 中に "Peach" というキーがあるよ
}

JavaScript で連想配列に特定のデータ (Value) があるか

調べたけどネイティブだと存在しなさそう。Underscore.js には Object.values() というメソッドがあって、これが連想配列の値たちを取り出した配列を返してくれるので、これをパクって定義すると使えそう。

// 連想配列 (オブジェクト) のデータ (値) を配列にして返すメソッドを自前で定義する
Object.prototype.values = function() {
  var o = this;
  var r = [];
  for(var k in o) {
    if(o.hasOwnProperty(k)) {
      r.push(o[k]);
    }
  }
  return r;
};

var hash = {
  "Apple": "りんご",
  "Tangerine": "みかん",
  "Peach": "もも"
};

if(hash.values().indexOf("もも") >= 0) {
  // Hash 中に "もも" というデータがあるよ
}