JavaScriptを使用してオブジェクトに値が存在するかどうかを確認する方法


102

JavaScriptにオブジェクトがあります。

var obj = {
   "a": "test1",
   "b": "test2"
}

test1が値としてオブジェクトに存在することをどのように確認しますか?


16
うわー。重複としてマークした人はクレイジーであるか、英語の読み方がわかりません。とにかく、ES7で、あなたのような何かを:Object.values(obj).includes('test1');
マリNaeemi

2
ここでは(キーのチェック)を重複しないように参照される:stackoverflow.com/questions/1098040/...
サミュエル・アスルンド

回答:


125

オブジェクトの値を配列に変換して、文字列が存在することをテストできます。これは、オブジェクトがネストされておらず、文字列が完全に一致していることを前提としています。

var obj = { a: 'test1', b: 'test2' };
if (Object.values(obj).indexOf('test1') > -1) {
   console.log('has test1');
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values


8
これはEcma2017の一部であり、ほとんどの用途ではまだ利用できません:(
Ran Halprin

2
IE 11とEdgeではサポートされていません。以下で説明するfor..inループを使用することをお勧めします
eugenesqr

24
少し冗長ではない: if(Object.values(obj).includes('test1')) { ... }
nickb 2017

40

Arrayメソッドを使用できます.some

var exists = Object.keys(obj).some(function(k) {
    return obj[k] === "test1";
});

35

試してください:

var obj = {
   "a": "test1",
   "b": "test2"
};

Object.keys(obj).forEach(function(key) {
  if (obj[key] == 'test1') {
    alert('exists');
  }
});

または

var obj = {
   "a": "test1",
   "b": "test2"
};

var found = Object.keys(obj).filter(function(key) {
  return obj[key] === 'test1';
});

if (found.length) {
   alert('exists');
}

これは動作しませんNaNし、-0それらの値のために。===ECMAScript 6の新機能を(の代わりに)使用できます。

 Object.is(obj[key], value);

最新のブラウザでは、次のものも使用できます。

var obj = {
   "a": "test1",
   "b": "test2"
};

if (Object.values(obj).includes('test1')) {
  alert('exists');
}


24

for...inループを使用します。

for (let k in obj) {
    if (obj[k] === "test1") {
        return true;
    }
}

@Gregor次の値を取るときに「k」が再度定義されるため、問題ではありません。
Vikrant 2018

4
非常に過小評価されている答え、この方法のパフォーマンスは他のどの方法よりも優れています
PirateApp

2
それに同意します。非常に過小評価されている回答...
サマカブ

22

最短ES6 +ワンライナー:

let exists = Object.values(obj).includes("test1");

1
ただし、IEは.includes()をサポートしていないので、Nodeでサーバー側のみを使用するか、単にIEを気にしない場合にのみ使用してください。
ジョアン・ピメンテルフェレイラ

19

Object.values()を使用できます。

このObject.values()メソッドは、for...inループによって提供されるのと同じ順序で、指定されたオブジェクト自体の列挙可能なプロパティ値の配列を返し ます(違いは、for-inループがプロトタイプチェーンのプロパティも列挙することです)。

そして、indexOf()メソッドを使用します。

このindexOf()メソッドは、指定された要素が配列内で見つかる最初のインデックスを返します。存在しない場合は-1を返します。

例えば:

Object.values(obj).indexOf("test`") >= 0

より詳細な例を以下に示します。

var obj = {
  "a": "test1",
  "b": "test2"
}


console.log(Object.values(obj).indexOf("test1")); // 0
console.log(Object.values(obj).indexOf("test2")); // 1

console.log(Object.values(obj).indexOf("test1") >= 0); // true
console.log(Object.values(obj).indexOf("test2") >= 0); // true 

console.log(Object.values(obj).indexOf("test10")); // -1
console.log(Object.values(obj).indexOf("test10") >= 0); // false


8

私はこれらすべての例でテストを行い、これをNode.js v8.11.2で実行しました。これをガイドとして、最適な選択を行ってください。

let i, tt;
    const obj = { a: 'test1', b: 'test2', c: 'test3', d: 'test4', e: 'test5', f: 'test6' };

console.time("test1")
i = 0;
for( ; i<1000000; i=i+1) {
  if (Object.values(obj).indexOf('test4') > -1) {
    tt = true;
  }
}
console.timeEnd("test1")

console.time("test1.1")
i = 0;
for( ; i<1000000 ; i=i+1) {
  if (~Object.values(obj).indexOf('test4')) {
    tt = true;
  }
}
console.timeEnd("test1.1")

console.time("test2")
i = 0;
for( ; i<1000000; i=i+1) {
  if (Object.values(obj).includes('test4')) {
    tt = true;
  }
}
console.timeEnd("test2")


console.time("test3")
i = 0;
for( ; i<1000000 ; i=i+1) {
  for(const item in obj) {
    if(obj[item] == 'test4') {
      tt = true;
      break;
    }
  }
}
console.timeEnd("test3")

console.time("test3.1")
i = 0;
for( ; i<1000000; i=i+1) {
  for(const [item, value] in obj) {
    if(value == 'test4') {
      tt = true;
      break;
    }
  }
}
console.timeEnd("test3.1")


console.time("test4")
i = 0;
for( ; i<1000000; i=i+1) {
  tt = Object.values(obj).some((val, val2) => {
    return val == "test4"
  });
}
console.timeEnd("test4")

console.time("test5")
i = 0;
for( ; i<1000000; i=i+1) {
  const arr = Object.keys(obj);
  const len = arr.length;
  let i2 = 0;
  for( ; i2<len ; i2=i2+1) {
    if(obj[arr[i2]] == "test4") {
      tt = true;
      break;
    }
  }
}
console.timeEnd("test5")

サーバー上の出力

test1:   272.325 ms
test1.1: 246.316 ms
test2:   251.98 0ms
test3:    73.284 ms
test3.1: 102.029 ms
test4:   339.299 ms
test5:    85.527 ms


2

あなたはこれを試すことができます:

function checkIfExistingValue(obj, key, value) {
    return obj.hasOwnProperty(key) && obj[key] === value;
}
var test = [{name : "jack", sex: F}, {name: "joe", sex: M}]
console.log(test.some(function(person) { return checkIfExistingValue(person, "name", "jack"); }));

0

あなたはこれを試すことができます

var obj = {
  "a": "test1",
  "b": "test2"
};

const findSpecificStr = (obj, str) => {
  return Object.values(obj).includes(str);
}

findSpecificStr(obj, 'test1');

-1
getValue = function (object, key) {
    return key.split(".").reduce(function (obj, val) {
        return (typeof obj == "undefined" || obj === null || obj === "") ? obj : (_.isString(obj[val]) ? obj[val].trim() : obj[val]);}, object);
};

var obj = {
   "a": "test1",
   "b": "test2"
};

呼び出される関数:

 getValue(obj, "a");

このソリューションを実装するときに他のライブラリを使用しましたか?
SherwinAblañaDapito

-2
var obj = {"a": "test1", "b": "test2"};
var getValuesOfObject = Object.values(obj)
for(index = 0; index < getValuesOfObject.length; index++){
    return Boolean(getValuesOfObject[index] === "test1")
}

Object.values()メソッドは、指定されたオブジェクト(obj)自身の列挙可能なプロパティ値を含む(getValuesOfObjectに割り当てられた)配列を返しました。配列はforループを使用して反復され、各値(getValuesfromObjectの値)を取得し、式( "text1"がループ配列の値)がtrueかどうかを確認するBoolean()関数を返します。



-4

これに対する簡単な答えを以下に示します。

これは、すべてのJavaScriptタイプにプロトタイプのコンストラクタ」プロパティがあるため機能しています。

ここに画像の説明を入力してください

ここに画像の説明を入力してください


4
画像ではなくテキストとしてコードを回答に追加してください。「MarkdownまたはHTMLを使用して投稿をフォーマットするにはどうすればよいですか?
Vasil Velichkov

画像内のコードをテキストに転記してください。前もって感謝します。
Peter Mortensen

-7

これは簡単なチェックです。

例1

var myObj = {"a": "test1"}

if(myObj.a == "test1") {
    alert("test1 exists!");
}

1
これは値ではなくキーをチェックします。
jcubic 2016年

1
var a = {};'hasOwnProperty' in a' //true
モノ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.