JavaScriptでオブジェクトにプロパティがあるかどうかを確認するにはどうすればよいですか?


168

私が宣言すると仮定して

var ad = {}; 

このオブジェクトにユーザー定義のプロパティが含まれるかどうかを確認するにはどうすればよいですか?

回答:


86

次のように、オブジェクトのプロパティをループできます。

for(var prop in ad) {
    if (ad.hasOwnProperty(prop)) {
        // handle prop as required
    }
}

hasOwnProperty()メソッドを使用して、オブジェクトが指定されたプロパティをダイレクトプロパティとして持ち、オブジェクトのプロトタイプチェーンから継承されていないかどうかを判断することが重要です。

編集する

コメントから: あなたはそのコードを関数に入れ、コメントがある部分に到達するとすぐにfalseを返すようにすることができます

性能試験

プロパティのテスト時のObject.KeysとFor..Inのテスト


2
こんにちはダニエル、実際には、オブジェクトにユーザー定義のプロパティが含まれているかどうかを確認するデバイスを探しています。特定のプロパティが存在するかどうかを確認しません。
リッキー

7
@Ricky:そのコードを関数に入れて、コメントがある部分に到達したらすぐにfalseを返すようにすることができます。
Daniel Vassallo、2010

8
私はこれらの日を使用して考えるObject.keys最も簡単でしょう:var a = [1,2,3];a.something=4;console.log(Object.keys(a))それはすでにあなたが安全にシムができECMA 5の一部だからです:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
HMR

2
ES5の「今日」では、ネイティブオブジェクトは列挙できない独自のプロパティを持つことができますObject.defineProperty(obj, 'foo', {enumerable:false, value:'foo'})
RobG 2014年

2
このソリューションは、存在するキー確認する方法ですが、以下のObject.keys(x).lengthを使用して、真の、効率的で最も正しい答えを以下に示します。独自の関数を作成する必要はありません。すでに存在しています。
dudewad 2017

196

組み込みObject.keysメソッドを使用して、オブジェクトのキーのリストを取得し、その長さをテストできます。

var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values

if(Object.keys(x).length > 0){
 // Your code here if x has some properties  
}

14
これが正解です。上記の受け入れられた答えは回避策であり、キーの数をチェックするだけよりもコストがかかります。これは道理にかなっています。
dudewad 2017

6
Object.keys( "mystring"); 望ましくないキーも生成します。この答えは私の意見では不完全です。
マイクデクラーク2017

2
@MikedeKlerkはObject.keys( "mystring");ではないので注意深く読んでください。オブジェクトのすべてのキーの配列を返すのはObject.keys(objectVariableName)です。ex:{'x': 'abc'、 'y': 'def'} ['x'、 'y']
Dhaval Chaudhary

3
@DhavalChaudhary私のコメントへの返信ありがとうございます。このコードを試すとvar str = "MyString"; Object.keys(str);、コンソールは各文字に対して0から7までの8つのキーを出力します。それとも私はまだ答えを理解していませんか?
マイクデクラーク2017

6
@MikedeKlerkしかし、それはオブジェクトの唯一のソリューションであり、文字列ではありません。plsは質問を参照します。
Dhaval Chaudhary 2017

111

簡単な関数を作るのはどうですか?

function isEmptyObject(obj) {
  for(var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
      return false;
    }
  }
  return true;
}

isEmptyObject({}); // true
isEmptyObject({foo:'bar'});  // false

へのhasOwnProperty直接のメソッド呼び出しObject.prototypeは、安全性を少し追加するだけです。通常のobj.hasOwnProperty(...)呼び出しを使用して次のことを想像してください。

isEmptyObject({hasOwnProperty:'boom'});  // false

注:( 将来的に) 上記のメソッドはfor...inステートメントに依存し、このステートメントは列挙可能なプロパティに対してのみ反復します。現在最も広く実装されているECMAScript標準(第3版)では、プログラマは列挙できないプロパティを作成する方法がありません。

ただし、これはECMAScript 5th Editionで変更されており、列挙不可、書き込み不可、または削除不可のプロパティを作成できるため、上記のメソッドは失敗する可能性があります。例:

var obj = {};
Object.defineProperty(obj, 'test', { value: 'testVal', 
  enumerable: false,
  writable: true,
  configurable: true
});
isEmptyObject(obj); // true, wrong!!
obj.hasOwnProperty('test'); // true, the property exist!!

この問題のECMAScript 5ソリューションは次のとおりです。

function isEmptyObject(obj) {
  return Object.getOwnPropertyNames(obj).length === 0;
}

このObject.getOwnPropertyNamesメソッドは、すべてArrayの名前を含む列挙可能なかどうかにかかわらず、オブジェクトのプロパティの。このメソッドは現在、ブラウザベンダーによって実装されており、すでにChrome 5ベータ版と最新のWebKit Nightly Buildsにあります。

Object.defineProperty これらのブラウザと最新のFirefox 3.7 Alphaリリースでも利用できます。


1
obj.hasOwnProperty(prop)よりもObject.prototype.hasOwnProperty.call(obj、prop)の利点は何ですか?
Casey Chu、

3
@Casey、編集済み、オブジェクトがhasOwnPropertyプロパティをオーバーライドすると、関数がクラッシュする可能性があります...私は少し偏執狂だと知っています...しかし、コードがどのような環境で使用されるかわからないことがありますが、あなたはどの方法を使いたいか知っています...
CMS

2
この質問に答えるための+1 ...およびその他の将来の質問!:)
ダニエル・ヴァッサロ

1
IEにもバグがあり、名前のプロパティObject.prototypeがの列挙できないプロパティと一致する場合、によって列挙されないことに注意してくださいfor...in。だから、isEmptyObject({toString:1})失敗します。これは、汎用マッピングとしてまったく使用できないという残念な理由の1つですObject
ボビンス2010

1
@ MichaelMartin-Smucker— キーは列挙可能な独自のプロパティのみを返すため、ここでは適していません。
RobG 2014年

58

ではjQueryのあなたは使用することができます。

$.isEmptyObject(obj); // Returns: Boolean

jQuery 1.4以降、このメソッドはオブジェクト自体のプロパティと、プロトタイプから継承されたプロパティ(hasOwnPropertyを使用しない)の両方をチェックします。

ECMAScript第5版、現代のブラウザで(IE9 +、FF4 +、Chrome5 +、Opera12 +、Safari5 +)あなたはに建て使用することができますObject.keysの方法:

var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;

またはプレーンな古いJavaScript:

var isEmpty = function(obj) {
               for(var p in obj){
                  return false;
               }
               return true;
            };


13

underscore.jsを使用している場合は、_。isEmpty関数を使用できます。

var obj = {};
var emptyObject = _.isEmpty(obj);

1
通り過ぎる人のためだけに、これはオブジェクト専用のメソッドではありません。_.isEmpty([]) // true 最初に必ず確認してください:stackoverflow.com/a/22482737/1922747
djv

11

lodashを使用する場合は、このsomeメソッドを使用できます。

_.some(obj) // returns true or false

この小さなjsbinの例を見る


var x = [1,2] // true
djv

@damionjn例にコードを追加しました。配列が間違った答えを返すという点がわかりますが、OPは最初に変数をオブジェクトとして宣言したので、これを仮定しても大丈夫だと思います。アンダースコアのisEmptyメソッドを使用する上記の回答があります(lodashにも同じメソッドがあります)。その答えにはまったく同じ問題があります。isEmptyに空でない配列を指定すると、間違った結果も得られます。
sfs

十分に公平ですが、ベストプラクティスを確実にするために、対象となるすべてのベースで回答を提供する必要があります。あなたは正しい、私は批判なしに彼の答えを通り過ぎた。通り過ぎる人のために、これはオブジェクト専用のメソッドではありません。_.some([1, 2]) // true 最初に必ず確認してください:stackoverflow.com/a/13356338/1922747
djv

5
for (var hasProperties in ad) break;
if (hasProperties)
    ... // ad has properties

安全でオブジェクトプロトタイプをチェックする必要がある場合(これらは特定のライブラリによって追加され、デフォルトでは追加されません):

var hasProperties = false;
for (var x in ad) {
    if (ad.hasOwnProperty(x)) {
        hasProperties = true;
        break;
    }
}
if (hasProperties)
    ... // ad has properties

1
ソリューションでは、不要なプロトタイププロパティのフィルタリングは行われません。つまり、Prototype.jsなどのライブラリを使用したり、経験の浅いユーザーがオブジェクトに追加のプロトタイププロパティを追加したりすると、動作に問題が生じる可能性があります。このページでDanielsソリューションを確認してください。
Joscha、2010

ライブラリを使用したり、オブジェクトのプロトタイプを拡張したりするために経験がなくてもかまいません。一部の経験豊富なプログラマーは、これを常に行います。
Alsciende 2010

2
for(var memberName in ad)
{
  //Member Name: memberName
  //Member Value: ad[memberName]
}

メンバーとは、メンバーのプロパティ、メンバー変数など、呼び出したい名前を意味します> _>

上記のコードは、toStringを含むすべてを返します...オブジェクトのプロトタイプが拡張されているかどうかを確認するだけの場合:

var dummyObj = {};  
for(var memberName in ad)
{
  if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A
  //Member Name: memberName
  //Member Value: ad[memberName]

}

注A:ダミーオブジェクトのメンバーが、テストオブジェクトのメンバーと同じ型であるかどうかを確認します。拡張の場合、dummyobjectのメンバータイプは「未定義」である必要があります


こんにちは、オブジェクトにプロパティが含まれているかどうかを確認できますか?ありがとう
リッキー

ソリューションでは、不要なプロトタイププロパティのフィルタリングは行われません。つまり、Prototype.jsなどのライブラリを使用したり、経験の浅いユーザーがオブジェクトに追加のプロトタイププロパティを追加したりすると、動作に問題が生じる可能性があります。
Joscha、2010

このページでDanielsソリューションを確認してください。エラーが発生しにくいのです。
Joscha、2010

2
最初のコードブロックはそれをまったくカバーしていません。未定義の「ad」オブジェクトに変数を追加すると、2番目のコードブロックが正しく動作しません。本当に、ダニエルズの回答を確認してください。「hasOwnProperty」と呼ばれるネイティブ実装を使用しているため、これが唯一の正しい高速な回答です。
Joscha、2010

@Ricky:オブジェクトにプロパティが含まれているかどうかを確認する場合は、私の答えにある例を単純に使用できます:stackoverflow.com/questions/2673121/…。コードがコメントに達した場合、オブジェクトには直接のプロパティがありません。そうでない場合は、そうなります。
Daniel Vassallo、2010

2
var hasAnyProps = false; for (var key in obj) { hasAnyProps = true; break; }
// as of this line hasAnyProps will show Boolean whether or not any iterable props exist

シンプルで、すべてのブラウザで機能します。技術的にはオブジェクトのすべてのキーのループですが、すべてをループするわけではありません。 1つ(私たちがチェックしているのは、何かがあるかどうかだけなので...なぜ続けるのですか?)


1

非常に遅い答えですが、これはプロトタイプで処理する方法です。

Array.prototype.Any = function(func) {
    return this.some(func || function(x) { return x });
}

Object.prototype.IsAny = function() {
    return Object.keys(this).Any();
}

0

オブジェクトがユーザー定義のオブジェクトであることを確認したら、UDOが空かどうかを確認する最も簡単な方法は次のコードです。

isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};

この方法は(本質的に)演繹的な方法ですが、これは最速かつ最速の方法です。

a={};
isEmpty(a) >> true

a.b=1
isEmpty(a) >> false 

PS:!ブラウザ定義のオブジェクトでは使用しないでください。


...戻り値0; return 1}; 同じでしょうか?
commonpike

1
@pike no、return!1; return!0はreturn false; return trueと同じ
クリストフ

0

遅い答えですが、一部のフレームワークはオブジェクトを列挙可能として扱います。したがって、bob.jsは次のように実行できます。

var objToTest = {};
var propertyCount = bob.collections.extend(objToTest).count();

0

次のものを使用できます。

ダブルバン!! プロパティ検索

var a = !![]; // true
var a = !!null; // false

hasOwnProperty これは私が以前使用していたものです:

var myObject = {
  name: 'John',
  address: null
};
if (myObject.hasOwnProperty('address')) { // true
  // do something if it exists.
}

ただし、JavaScriptはメソッド名を保護しないことを決定したため、改ざんされる可能性があります。

var myObject = {
  hasOwnProperty: 'I will populate it myself!'
};

myObjectのprop

var myObject = {
  name: 'John',
  address: null,
  developer: false
};
'developer' in myObject; // true, remember it's looking for exists, not value.

タイプの

if (typeof myObject.name !== 'undefined') {
  // do something
}

ただし、nullはチェックされません。

これが一番いい方法だと思います。

オペレーター

var myObject = {
  name: 'John',
  address: null
};

if('name' in myObject) {
  console.log("Name exists in myObject");
}else{
  console.log("Name does not exist in myObject");
}

結果:

名前はmyObjectに存在します

次に、in演算子の詳細へのリンクを示します。オブジェクトプロパティが存在するかどうかの判断


0

ES6関数

/**
 * Returns true if an object is empty.
 * @param  {*} obj the object to test
 * @return {boolean} returns true if object is empty, otherwise returns false
 */
const pureObjectIsEmpty = obj => obj && obj.constructor === Object && Object.keys(obj).length === 0

例:


let obj = "this is an object with String constructor"
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = {}
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = []
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = [{prop:"value"}]
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = {prop:"value"}
console.log(pureObjectIsEmpty(obj)) // empty? false

-1

これはどう?

var obj = {},
var isEmpty = !obj;
var hasContent = !!obj

この答えは質問には答えません。OPは、オブジェクトにユーザー定義のプロパティが含まれているかどうかを尋ねています-答えは、オブジェクト自体がブール値falseに変換されるかどうかをチェックします。
Jasmonate

...そして、ジェームズはすでにこのオプションを彼の回答に含めていることにも気付きました。すみません。
Peter Toth
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.