JavaScriptでオブジェクトプロパティをチェックするための「not in」演算子はありますか?


182

JavaScriptに、オブジェクトにプロパティが存在しないかどうかを確認するための「not in」演算子はありますか?GoogleやStack Overflowの周りではこれについて何も見つかりませんでした。この種の機能が必要な場所で私が取り組んでいるコードの小さなスニペットは次のとおりです。

var tutorTimes = {};

$(checked).each(function(idx){
  id = $(this).attr('class');

  if(id in tutorTimes){}
  else{
    //Rest of my logic will go here
  }
});

ご覧のとおり、すべてをelseステートメントに入れています。その部分を使用するためだけにifelseステートメントを設定するのは私には間違っているようですelse


4
あなたはvar id = ...あなたの機能に望んでいるかもしれません。
コビー2012年

回答:


338

else部分だけを使用するためにif / elseステートメントを設定するのは私には間違っているようです...

条件を否定するだけで、else内部のロジックを取得できますif

if (!(id in tutorTimes)) { ... }

11
このスタイルは、もしそうした場合に表示されるJSHintの「 '!'の使用の混乱」警告を修正します( ! somekey in someobj )
mikemaccana

3
がプロトタイプチェーンのどこかでプロパティ名を検索すること注意してください。詳細については、私の回答を参照してください。
いくつかの

25
私はこれが現在最良の解決策であることを理解していますが、誰かがこれがちょっと醜いことに同意しますか?
ジョナ2016年

3
それは醜いだ場合、単に🙃機能でそれをラップし、それに美しい名前を与えるlet keyExists = (key, obj) => key in obj
Kamafeather

全くもって同じ意見です。確かに私のネーミングスキルも向上させることができました😁。let hasProperty「よく見える」
カマフェザー

37

ジョルダンがすでに言ったように、それを否定するだけです:

if (!(id in tutorTimes)) { ... }

注:上記のテストでは、tutorTimes に、プロトタイプチェーンの任意の場所の idで指定された名前のプロパティがあるかどうかをテストします。たとえば、Object.prototypeで定義されているため、trueを"valueOf" in tutorTimes返します

現在のオブジェクトにプロパティが存在しないかどうかをテストする場合は、hasOwnPropertyを使用します。

if (!tutorTimes.hasOwnProperty(id)) { ... }

または、hasOwnProperyのキーがある場合、これを使用できます。

if (!Object.prototype.hasOwnProperty.call(tutorTimes,id)) { ... }

それはいずれかがあり、より安全な引用符と、使用中の鍵をラップしますかif(!tutorTimes.hasOwnProperty('id')) ...
Majid Fouladpour

@MajidFouladpour idは任意の値をとることができる変数であり、idの'id' 2文字の文字列であるため、変数idで指定されたプロパティが存在するかどうか、idという名前のプロパティがあるかどうかをチェックします。hasOwnProperty(id)hasOwnProperty('id')
いくつかの

16

個人的に私は見つける

if (id in tutorTimes === false) { ... }

より読みやすい

if (!(id in tutorTimes)) { ... }

しかし、どちらも機能します。


14

2つの簡単な可能性:

if(!('foo' in myObj)) { ... }

または

if(myObj['foo'] === undefined) { ... }

5
'undefined' === typeof xxx代わりに使用してください。undefinedは予約語ではなく、実際には上書き可能なグローバル変数です(バグの発見が困難になる)
hugomg

9
@hippietrailが機能しません...「!」の後に括弧が必要です とその周辺'foo' in myObj)
Phil Cooper

4
myObj['foo']プロパティとして存在し、単にundefined(つまり、ステートメントでmyObj.foo = undefined)に設定できます。プロパティ自体が存在しないかどうかを本当に確認したい場合は、!('foo' in myObj)表記法が必要です。
Richard Connamacher 2012

私たちの間でパフォーマンスを重視する場合、チェックmyObj.foo === undefinedは(潜在的に危険ですが)はるかに高速です:jsperf.com/not-in-vs-is-undefined
etpinard、2015年

@hugomgを使用しないことについては、これは非常に良い考えではないと思います=== undefinedundefinedJavaScript での上書きなど、プログラミング言語を乱用すると、多くのことが失敗する可能性があります。また、以下を参照してください。stackoverflow.com/questions/8783510/...
ZERO3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.