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

3155
Adam Ernst 2009-07-09 03:21.

JavaScriptオブジェクトまたは配列に特定のキーが存在するかどうかを確認するにはどうすればよいですか?

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

21 answers

4392
Ates Goral 2009-07-09 05:51.

未定義をチェックすることは、キーが存在するかどうかをテストする正確な方法ではありません。キーは存在するが、値が実際にある場合は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そしてキーがありundefined、この参照のベンチマークを

317
rdllopes 2014-02-28 06:38.

素早い回答

JavaScriptオブジェクトまたは配列に特定のキーが存在するかどうかを確認するにはどうすればよいですか?キーが存在せず、アクセスしようとすると、falseが返されますか?またはエラーをスローしますか?

(連想)配列スタイルまたはオブジェクトスタイルを使用して欠落しているプロパティに直接アクセスすると、未定義の定数が返されます。

遅いと信頼性オペレータとhasOwnPropertyをする方法

すでにここで言及しているように、「未定義」の定数に関連付けられたプロパティを持つオブジェクトを持つことができます。

 var bizzareObj = {valid_key:  undefined};

その場合、hasOwnPropertyまたはin演算子を使用して、キーが実際に存在するかどうかを確認する必要があります。しかし、しかし、どのような価格で?

だから、私はあなたに言います...

in演算子とhasOwnPropertyは、Javascriptのプロパティ記述子メカニズムを使用する「メソッド」です(Java言語のJavaリフレクションに似ています)。

http://www.ecma-international.org/ecma-262/5.1/#sec-8.10

プロパティ記述子タイプは、名前付きプロパティ属性の操作と具体化を説明するために使用されます。プロパティ記述子タイプの値は、名前付きフィールドで構成されるレコードです。各フィールドの名前は属性名であり、その値は8.6.1で指定されている対応する属性値です。さらに、任意のフィールドが存在する場合と存在しない場合があります。

一方、オブジェクトのメソッドまたはキーを呼び出すには、Javascript [[Get]]メカニズムが使用されます。それははるかに速いです!

基準

http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array

使用 中にオペレータ
var result = "Impression" in array;

結果は

12,931,832 ±0.21% ops/sec      92% slower 
hasOwnPropertyの使用
var result = array.hasOwnProperty("Impression")

結果は

16,021,758 ±0.45% ops/sec     91% slower
要素に直接アクセスする(ブラケットスタイル)
var result = array["Impression"] === undefined

結果は

168,270,439 ±0.13 ops/sec     0.02% slower 
要素に直接アクセスする(オブジェクトスタイル)
var result = array.Impression  === undefined;

結果は

168,303,172 ±0.20%     fastest

編集:プロパティにundefined値を割り当てる理由は何ですか?

その質問は私を困惑させます。Javascriptには、次のような問題を回避するために、存在しないオブジェクトの参照が少なくとも2つnullありundefinedます。

nullは、オブジェクト値が意図的に存在しないこと、または簡単に言えば、確認された値の欠如を表すプリミティブ値です。一方、undefinedは不明な値です(定義されていません)。後で適切な値で使用されるプロパティがある場合は、最初の瞬間にプロパティに値がないことが確認されているため、null代わりに参照を使用することを検討してください。undefined

比較:

var a = {1: null}; 
console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.:  the value is defined. 
console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].

助言

undefined値を持つオブジェクトは避けてください。可能な限り直接チェックし、nullプロパティ値の初期化に使用します。それ以外の場合は、slowin演算子またはhasOwnProperty()メソッドを使用します。

編集:2018年12月4日-これ以上関係ない

人々がコメントしているように、Javascriptエンジンの最新バージョン(Firefoxを除く)は、アクセスプロパティのアプローチを変更しました。この特定のケースでは、現在の実装は前の実装よりも低速ですが、アクセスキーとオブジェクトの違いは無視できます。

152
Eli Courtwright 2009-07-09 03:24.

戻り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
}
33
handle 2015-07-02 02:45.

受け入れ答えはを参照するオブジェクト。キーの代わりにデータを検索するために配列のin演算子を使用することに注意してください。

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

配列内の既存の要素をテストするには:アイテムがJavaScript配列内にあるかどうかを確認する最良の方法は?

31
user2320522 2013-04-26 05:45.
"key" in obj

配列キーとは大きく異なるオブジェクト属性値のみをテストしている可能性があります

25
Lavi Avigdor 2013-11-12 23:19.

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

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

参照:

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

15
vatsal 2014-05-30 09:37.

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

あなたの場合、_。hasメソッドを使用できます。例:

yourArray = {age: "10"}

_.has(yourArray, "age")

trueを返します

だが、

_.has(yourArray, "invalidKey")

falseを返します

15
Webeng 2016-06-22 16:29.

回答:

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

説明:

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

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

11
jaredwilli 2016-03-06 02:56.

これが私がとても便利だと思うヘルパー関数です

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

検索したいキーを渡して、検索したいobj(オブジェクトまたは配列)を検索するだけです。

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;
    }

// How to use it:
// Searching for keys in Arrays
console.log(keyExists('apple', ['apple', 'banana', 'orange'])); // true
console.log(keyExists('fruit', ['apple', 'banana', 'orange'])); // false

// Searching for keys in Objects
console.log(keyExists('age', {'name': 'Bill', 'age': 29 })); // true
console.log(keyExists('title', {'name': 'Jason', 'age': 29 })); // false

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

9
Hajji Tarik 2017-01-26 05:39.

バニラjs

yourObjName.hasOwnProperty(key) : true ? false;

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

Object.keys(yourObjName).length : true ? false
9
kind user 2017-03-27 05:45.

ES6ソリューション

とを使用Array#someObject.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');

1行の例。

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

6
Mohan Dere 2016-12-03 05:38.

使用できます- hasOwnProperty.call(obj, key);

underscore.js道-

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

_.has = function(obj, key) {
  return hasOwnProperty.call(obj, key);
};
5
shekhardtu 2018-11-06 05:30.

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

"key" in object

例えば:

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

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

4
vsync 2017-03-30 04:47.

ているもののために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>


その鍵は、しかし、もしこれが効果的にチェックします深く、定義されておりません。そのキーが定義されていない場合は、プログラムの流れを害する可能性があるエラーをスローします。

4
Alex 2018-09-08 00:04.

オブジェクトの任意の深さで任意のキーをチェックし、誤った値を考慮したい場合は、ユーティリティ関数の次の行を検討してください。

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

4
realappie 2018-01-04 06:05.

これは必ずしもキーが存在するかどうかをチェックするわけではありませんが、値の真実性をチェックします。どちらundefinednull該当します。

Boolean(obj.foo)

私はtypescriptを使用しており、そのような文字列を使用し'foo' in objたりobj.hasOwnProperty('foo')、キーが存在するかどうかを確認したりしても、インテリセンスが得られないため、このソリューションは私にとって最適です。

3
sarea 2019-08-27 04:12.
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';
3
Kamil Kiełczewski 2020-01-30 23:20.

「配列」の世界では、インデックスをある種のキーと見なすことができます。驚くべきことに、in演算子(オブジェクトに適しています)は配列でも機能します。存在しないキーの戻り値はundefined

let arr = ["a","b","c"]; // we have indexes: 0,1,2
delete arr[1];           // set 'empty' at index 1
arr.pop();               // remove last item

console.log(0 in arr,  arr[0]);
console.log(1 in arr,  arr[1]);
console.log(2 in arr,  arr[2]);

2
Anupam Maurya 2019-02-20 00:59.

yourArray.indexOf(yourArrayKeyName)> -1

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

fruit.indexOf('apple') > -1

true


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

fruit.indexOf('apple1') > -1

false

0
Alexander 2018-02-22 04:23.

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

// 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"]
0
jerryurenaa 2020-06-19 07:13.

速くて簡単な解決策は、オブジェクトをjsonに変換することです。そうすれば、この簡単なタスクを実行できるようになります。

    const allowed = {
        '/login' : '',
        '/register': '',
        '/resetpsw': ''
    };
    console.log('/login' in allowed); //returns true

配列を使用する場合、オブジェクトキーは0、1、2、3などの整数に変換されるため、常にfalseになります。

Related questions

MORE COOL STUFF

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire が息子の Shelby Blackstock と共有しているクリスマスの伝統について学びましょう。

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルとマライア・キャリーが自然な髪の上でどのように結合したかについて、メーガンの「アーキタイプ」ポッドキャストのエピソードで学びましょう.

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子が家族、特にチャールズ王とウィリアム王子との関係について望んでいると主張したある情報源を発見してください。

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドが、母親のナオミ・ジャッドが亡くなってから初めての感謝祭のお祝いを主催しているときに、彼女が今では家長であることをどのように認識したかを学びましょう.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

世界最小のマルチツールを15ドルでキーチェーンに追加

世界最小のマルチツールを15ドルでキーチェーンに追加

爪| $ 15 | マルボロ&ケインザクロー| $ 15 | Malboro&Kane世界最小のマルチツールであるTheClawをたった15ドルで手に入れましょう。男の子と一緒に冷たいものを割って開けたり、ネジを締めたり、Amazonパッケージを細断したりする場合でも、この悪い男の子はこれまでで最も便利な製品の1つです。

ワンダーウーマンの続編の悪役についてのより多くの噂

ワンダーウーマンの続編の悪役についてのより多くの噂

ワンダーウーマンとしてのガル・ガドット。WaywardPinesは正式に終了しました。

42,000試合で作られた球がスローモーションで燃えるのを見るのは魅力的な光景です

42,000試合で作られた球がスローモーションで燃えるのを見るのは魅力的な光景です

人が2つのマッチを接着するように導くものは何ですか?何があなたをマッチに打ち続け、構造が湾曲していることを発見するのですか?42,000のボールを作るまで、試合を続けなければならない理由は何ですか?しかし、何よりも、これほど魅力的なショーである可能性はどのようにありますか?私はあなたをだますつもりはありません、次に私たちがあなたに残すのは、あなたや私のような人が自由な時間を過ごすことを決定するビデオですボールを作るために必要な試合数を確認します(答えは42です。

サクラメントビーが1950万人のカリフォルニア州の有権者記録を漏らし、ハッカーによって即座に侵害された

サクラメントビーが1950万人のカリフォルニア州の有権者記録を漏らし、ハッカーによって即座に侵害された

写真:AP先月、カリフォルニアの地元新聞が1,900万件以上の有権者記録をオンラインで公開しました。Gizmodoは今週、明らかなランサムウェア攻撃中にレコードが侵害されたことを確認しました。

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

ロシアのフィギュアスケーター、カミラ・バリエバが関与したドーピング事件が整理されているため、チームは2022年北京冬季オリンピックで獲得したメダルを待っています。

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

何千人ものAmazonの買い物客がMulberry Silk Pillowcaseを推奨しており、現在販売中. シルクの枕カバーにはいくつかの色があり、髪を柔らかく肌を透明に保ちます。Amazonで最大46%オフになっている間にシルクの枕カバーを購入してください

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

ラファイエット警察署は、「不審な男性が女性に近づいた」という複数の苦情を受けて、12 月にパデュー大学の教授の捜査を開始しました。

コンセプト ドリフト: AI にとって世界の変化は速すぎる

コンセプト ドリフト: AI にとって世界の変化は速すぎる

私たちの周りの世界と同じように、言語は常に変化しています。以前の時代では、言語の変化は数年または数十年にわたって発生していましたが、現在では数日または数時間で変化する可能性があります。

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

犯罪擁護派のオークランドが暴力犯罪者のロミオ・ロレンゾ・パーハムを釈放

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

認知症を患っている 91 歳のアジア人女性が最近、47 番街のアウター サンセット地区でロメオ ロレンゾ パーハムに襲われました。伝えられるところによると、被害者はサンフランシスコの通りを歩いていたところ、容疑者に近づき、攻撃を受け、暴行を受けました。

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

メリック・ガーランドはアメリカに失敗しましたか?

バイデン大統領の任期の半分以上です。メリック・ガーランドは何を待っていますか?

メリック・ガーランドはアメリカに失敗しましたか?

人々にチャンスを与えることは、人生で少し遅すぎると私は信じています。寛大に。

Language