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

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

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

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

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

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

ねえNFL、ジョーバロウとカイラーマレーは女性の権利をサポートするために少しの助けを使うことができます

ねえNFL、ジョーバロウとカイラーマレーは女性の権利をサポートするために少しの助けを使うことができます

ジョー・バロウロー対ウェイド事件の転覆に対応するNFLは、言葉を言わないことで、腹立たしいが予測可能なPRの結果でした。

別の日、別のヒンジのないLIV記者会見

別の日、別のヒンジのないLIV記者会見

(lから)パット・ペレス、ブルックス・ケプカ、パトリック・リードサウジアラビアのLIVゴルフリーグのさらに別の信じられないほどの記者会見で、スポーツのファンはブルックス・ケプカからでたらめな吐き気と質問回避の驚異的なマスタークラスを受けました。パトリックリード、ブライソンデシャンボー、パットペレス、最近のPGAツアーの脱北者。

ミズ・マーベルの家族の帰郷は悪役よりも激しく打撃を与える

ミズ・マーベルの家族の帰郷は悪役よりも激しく打撃を与える

レッドダガーとマーベルさんがチームを組んでいます。

6億7500万ドルのビットコインローンのデフォルト後にすべての資産を清算するように命じられたスリーアローズキャピタル

6億7500万ドルのビットコインローンのデフォルト後にすべての資産を清算するように命じられたスリーアローズキャピタル

暗号業界最大の沈没船の1つであるスリーアローズキャピタルは、ついにその悲惨さから解放されています。火曜日に、不良債権ヘッジファンドは、債権者からの返済を要求する訴訟の高まりに応えて、バージンアイランド裁判所によって清算を命じられました彼らが3ACに行ったローン。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

Suffragettes Indicam #3: Junho

Suffragettes Indicam #3: Junho

Mais um mês se findando — e metade do ano de 2022 já passou. Sabe o que isso significa? Não, não é hora de verificar se você está cumprindo com suas resoluções de Ano Novo.

Calin (Estudo de Caso UX/UI Design)

Calin (Estudo de Caso UX/UI Design)

Este projeto foi desenvolvido a partir de briefing fictício disponibilizado pelo site Tifólio, uma plataforma para designers. Briefing Matriz CSD Como ponto inicial utilizei como base algumas notícias atuais sobre meios de pagamento digital e com essas informações desenvolvi a Matriz CSD.

多元宇宙—Junø

多元宇宙—Junø

チェーン間アカウントがJunoに登場します。異なるブロックチェーン間でスマートコントラクトの構成可能性と真の相互運用性を提供します。

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

1.ドラマを見た後、起業する考えはありますか?あなたのビジネスはボトルネックに遭遇しましたか?方向性がなくてわからない場合は、ドラマを追いかけて行くことを心からお勧めします。(?)ブラフではなく、最も完璧なビジネス例を隠すドラマがあります。2.ブレイキング・バッドとその弁護士ドラマ「ブレイキング・バッド」を見た友人たちは、演劇の中で、穏やかな表情で、弁護士のソウル・グッドマンに深く感銘を受けなければなりません。口を開けて、感覚の弱い傭兵の性格を持っています。道徳の面で、サル・グッドマンは無意識のうちに劇に欠かせない役割を果たし、彼自身のシリーズ「絶望的な弁護士」(ベター・コール・ソール)を生み出しました。ウェントウのテキストとビデオは、劇中のソウル・グッドマンのテレビコマーシャルです。製品(サービス)、競争戦略、市場ポジショニング、ブランド名、ターゲット顧客グループ、コミュニケーション軸から広告まで、サル・グッドマンの役割のビジネス設定は、「最低」と見なすことができる超超超超超超完全です。ブランドコミュニケーションのコスト」「変化」のモデル。なぜ?私の分析をご覧ください。3.ソウル・グッドマンの「事業戦略」1.基本情報ブランド名:Saul Goodman製品:法律相談サービス対象顧客:麻薬中毒、飲酒運転、事故など。法律知識の欠如は、一般的に公立弁護士にしか余裕がなく、真面目な弁護士も「特別な法律を持つ消費者」を避けます。恐れてはいけない「​​ニーズ」。コミュニケーションの主軸:この国のすべての男性、女性、子供は有罪判決を受けるまで無実だと思います。地域:アルバカーキ市スローガン:Thrallに電話したほうがいいです!(ベター・コール・ソール)広告:2つの可能性のある犯罪状況をシミュレートします+サウルの主張+サウルのスローガン2をより適切に呼び出します。

Language