web-dev-qa-db-ja.com

JavaScriptオブジェクトにキーが存在するかどうかを確認する

特定のキーがJavaScriptのオブジェクトまたは配列に存在するかどうかを確認する方法を教えてください。

キーが存在しない状態でアクセスしようとすると、falseが返されますか?またはエラーをスローしますか?

2514
Adam Ernst

未定義性をチェックすることは、キーが存在するかどうかをテストする正確な方法ではありません。キーは存在するが、その値が実際にはundefinedである場合はどうなりますか?

var obj = { key: undefined };
obj["key"] != undefined // false, but the key exists!

代わりにin演算子を使用してください。

"key" in obj // true, regardless of the actual value

キーが存在しないかどうかを確認したい場合は、括弧を忘れずに使用してください。

!("key" in obj) // true if "key" doesn't exist in object
!"key" in obj   // ERROR!  Equivalent to "false in obj"

あるいは、オブジェクトインスタンスのプロパティ(継承されたプロパティではない)を特にテストしたい場合は、hasOwnPropertyを使用します。

obj.hasOwnProperty("key") // true

inhasOwnProperty、keyがundefinedの各メソッドのパフォーマンス比較については、 ベンチマーク を参照してください。

3361
Ates Goral

それはundefinedを返します。

var aa = {hello: "world"};
alert( aa["hello"] );      // popup box with "world"
alert( aa["goodbye"] );    // popup box with "undefined"

undefinedは特別な定数値です。だからあなたは言うことができます。

// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
    // do something
}

これがおそらく欠けているキーをチェックするための最良の方法です。ただし、以下のコメントで指摘されているように、実際の値をundefinedにすることが理論的には可能です。私はこれをする必要はなかったし、私が今までに望んだ理由を率直に考えて考えることはできませんが、完全を期すためにin演算子を使うことができます。

// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
    // do something
}
119
Eli Courtwright

受け入れられた答えオブジェクト を参照します。キーの代わりに in演算子 on Array を使用してデータを検索するように注意してください。

("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)

配列内の既存の要素をテストするには: 項目がJavaScriptの配列内にあるかどうかを調べる最も良い方法は?

24
handle
"key" in obj

配列キーとは非常に異なるオブジェクト属性値のみをテストする可能性があります。

20
user2320522

プロパティがJavaScriptオブジェクトに存在するかどうかを確認する3つの方法:

  1. !! obj.theProperty
    値をブール値に変換します。 'false'以外のすべての値に対してTRUEを返します。
  2. objの 'theProperty'
    プロパティが存在する場合、その値に関係なく(空でも)trueを返します
  3. obj.hasOwnProperty( 'theProperty')
    プロトタイプチェーンをチェックしません。 (すべてのオブジェクトに 'toString'メソッドがあるため、1と2はtrueを返しますが、3はfalseを返すことができます。)

参照: 

http://book.mixu.net/node/ch5.html

20
Lavi Avigdor

underscore.js libraryを使用している場合は、オブジェクト/配列操作が簡単になります。 

あなたの場合は_.hasメソッドを使うことができます。例:

yourArray = {age: "10"}

_.has(yourArray, "age")

true を返します 

しかし、

_.has(yourArray, "invalidKey")

false を返します

13
vatsal

答え:

if ("key" in myObj)
{
    console.log("key exists!");
}
else
{
    console.log("key doesn't exist!");
}

説明:

in演算子は、キーがオブジェクト内に存在するかどうかを確認します。値が未定義かどうかを確認した場合:if (myObj["key"] === 'undefined')undefinedの値を持つキーがオブジェクトに存在する可能性があるため、問題が発生する可能性があります。

そのため、最初にin演算子を使用してから、キーが存在することがわかったら、キーの内側にある値を比較することをお勧めします。

12
Webeng

これは私が非常に役に立つと思うヘルパー関数です。

このkeyExists(key, search)は、オブジェクトや配列内のキーを簡単に検索するために使用できます。 

検索したいキーを渡し、検索したいオブジェクト(オブジェクトまたは配列)を検索してください。

function keyExists(key, search) {
    if (!search || (search.constructor !== Array && search.constructor !== Object)) {
        return false;
    }
    for (var i = 0; i < search.length; i++) {
        if (search[i] === key) {
            return true;
        }
    }
    return key in search;
}

どうやって使うのですか:

配列内のキーを検索する

keyExists('Apple', ['Apple', 'banana', 'orange']); // true
keyExists('fruit', ['Apple', 'banana', 'orange']); // false

オブジェクト内のキーを検索する

keyExists('age', {'name': 'Bill', 'age': 29 }); // true
keyExists('title', {'name': 'Jason', 'age': 29 }); // false

それはかなり信頼でき、クロスブラウザでうまく機能します。

9
jaredwilli

ES6ソリューション

Array#someおよびObject.keysを使用します。与えられたキーがオブジェクトに存在すれば true を返し、存在しなければ false を返します。

var obj = {foo: 'one', bar: 'two'};
    
function isKeyInObject(obj, key) {
    var res = Object.keys(obj).some(v => v == key);
    console.log(res);
}

isKeyInObject(obj, 'foo');
isKeyInObject(obj, 'something');

一行の例です。

console.log(Object.keys({foo: 'one', bar: 'two'}).some(v => v == 'foo'));

5
kind user

バニラjs

yourObjName.hasOwnProperty(key) : true ? false;

オブジェクトにes2015で少なくとも1つのプロパティがあるかどうかを確認する場合

Object.keys(yourObjName).length : true ? false
5
Hajji Tarik

使えます - hasOwnProperty.call(obj, key);

underscore.js way -

if(_.has(this.options, 'login')){
  //key 'login' exists in this.options 
}

_.has = function(obj, key) {
  return hasOwnProperty.call(obj, key);
};
3
Mohan Dere

これは古い質問ですが、答えを出すのを遅らせることは決してないと思います。

オブジェクト "products"と2つのアイテムがあるとします。このオブジェクトにidが既に存在するかどうかを確認したい場合は、find()を使用できます。 

products = [
    {
        "id": 1,
        "name": "Name 1"
    },
    {
        "id": 2,
        "name": "Name 2"
    },
  ]

  item1 = 
    {
        "id": 3,
        "name": "Name 3",
    }



  item2 = 
    {
        "id": 1,
        "name": "Name 1",
    }



  if(products.find(x => x.id === item1.id)){
    console.log('id is in products');
  }else {
    console.log('id is not in products');
  }
  if(products.find(x => x.id === item2.id)){
    console.log('id is in products');
  }else {
    console.log('id is not in products');
  }

ログ:

id is not in products
id is in products
2
Admir

確認する最も簡単な方法は 

"key" in object

例えば: 

var obj = {
  a: 1,
  b: 2,
}
"a" in obj // true
"c" in obj // false

戻り値 true は、そのキーがオブジェクト内に存在することを意味します。 

2
shekhardtu

これは必ずキーが存在するかどうかをチェックしますが、値の真偽をチェックします。 undefinednullのどちらが該当します。

Boolean(obj.foo)

TypeScriptを使用していて、キーが存在するかどうかを確認するのに'foo' in objobj.hasOwnProperty('foo') のような文字列を使用しているので、この解決法は私には最適です。

1
Abdel

自分のプロジェクトにlodashが含まれている人のために:
「深い」キーを取得しようとするlodash _.get メソッドがあります。

オブジェクトのパスにある値を取得します。解決された値が未定義の場合、 defaultValueが代わりに返されます。

var object = { 'a': [{ 'b': { 'c': 3 } }] };

console.log(
  _.get(object, 'a[0].b.c'),           // => 3
  _.get(object, ['a', '0', 'b', 'c']), // => 3
  _.get(object, 'a.b.c'),              // => undefined 
  _.get(object, 'a.b.c', 'default')    // => 'default'
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>


これはそのキー、しかし deep が定義されているかどうかを効果的にチェックし、そのキーが定義されていないとnot notはあなたのプログラムの流れを損なうかもしれません。

1
vsync

これらの例は、さまざまな方法の違いを実証することができます。あなたのニーズに合ったものを選ぶのに役立つことを願っています:

// Lets create object `a` using create function `A`
function A(){};
A.prototype.onProtDef=2;
A.prototype.onProtUndef=undefined;
var a=new A();
a.ownProp = 3;
a.ownPropUndef = undefined;

// Let's try different methods:

a.onProtDef; // 2
a.onProtUndef; // undefined
a.ownProp; // 3
a.ownPropUndef; // undefined
a.whatEver; // undefined
a.valueOf; // ƒ valueOf() { [native code] }

a.hasOwnProperty('onProtDef'); // false
a.hasOwnProperty('onProtUndef'); // false
a.hasOwnProperty('ownProp'); // true
a.hasOwnProperty('ownPropUndef'); // true
a.hasOwnProperty('whatEver'); // false
a.hasOwnProperty('valueOf'); // false

'onProtDef' in a; // true
'onProtUndef' in a; // true
'ownProp' in a; // true
'ownPropUndef' in a; // true
'whatEver' in a; // false
'valueOf' in a; // true (on the prototype chain - Object.valueOf)

Object.keys(a); // ["ownProp", "ownPropUndef"]
1
Alexander

オブジェクト上の任意の深さにあるキーを調べ、誤った値を考慮したい場合は、この行を効用関数として考えてください。

var keyExistsOn = (o, k) => k.split(".").reduce((a, c) => a.hasOwnProperty(c) ? a[c] || 1 : false, Object.assign({}, o)) === false ? false : true;

結果

var obj = {
    test: "",
    locals: {
        test: "",
        test2: false,
        test3: NaN,
        test4: 0,
        test5: undefined,
        auth: {
            user: "hw"
        }
    }
}

keyExistsOn(obj, "")
> false
keyExistsOn(obj, "locals.test")
> true
keyExistsOn(obj, "locals.test2")
> true
keyExistsOn(obj, "locals.test3")
> true
keyExistsOn(obj, "locals.test4")
> true
keyExistsOn(obj, "locals.test5")
> true
keyExistsOn(obj, "sdsdf")
false
keyExistsOn(obj, "sdsdf.rtsd")
false
keyExistsOn(obj, "sdsdf.234d")
false
keyExistsOn(obj, "2134.sdsdf.234d")
false
keyExistsOn(obj, "locals")
true
keyExistsOn(obj, "locals.")
false
keyExistsOn(obj, "locals.auth")
true
keyExistsOn(obj, "locals.autht")
false
keyExistsOn(obj, "locals.auth.")
false
keyExistsOn(obj, "locals.auth.user")
true
keyExistsOn(obj, "locals.auth.userr")
false
keyExistsOn(obj, "locals.auth.user.")
false
keyExistsOn(obj, "locals.auth.user")
true

このNPMパッケージも参照してください。 https://www.npmjs.com/package/has-deep-value

0
Alex

yourArray.indexOf(yourArrayKeyName)> -1

fruit = ['Apple', 'grapes', 'banana']

fruit.indexOf('Apple') > -1

true


fruit = ['Apple', 'grapes', 'banana']

fruit.indexOf('Apple1') > -1

false

0
Anupam Maurya

JavaScript Destructuring :を使った新しい素晴らしいソリューション

let obj = {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
};

let {key1, key2, key3, key4} = obj;

// key1 = "value1"
// key2 = "value2"
// key3 = "value3"
// key4 = undefined

// Can easily use `if` here on key4
if(!key4) { console.log("key not present"); } // Key not present

確認してください その他のJavaScript Destructuringの使用

0
NAVIN
const object1 = {
  a: 'something',
  b: 'something',
  c: 'something'
};

const key = 's';

// Object.keys(object1) will return array of the object keys ['a', 'b', 'c']

Object.keys(object1).indexOf(key) === -1 ? 'the key is not there' : 'yep the key is exist';
0
sarea