2013-06-07 5 views
48

内のオブジェクトの数を数える:Javascriptが私のようなオブジェクトに何か持っているオブジェクト

Object {0=Object, 1=Object, 2=Object} // Output from console.log(obj.Data); 

をしかし、私は最終的に、サブオブジェクトから属性値を取得し、オブジェクト内のオブジェクトの数を数えることができる方法はありません。

私は

console.log(obj.Data[0].length); // It does not work 

console.log(obj.Data.length); // It does not work 

を試してみましたが、これは私のために少しトリッキーです。皆さんが助けてくれることを願っています。

+0

を試してみてください、あなたは完全なオブジェクトを投稿してくださいだろうか? –

+1

なぜこのようにオブジェクトを使用していますか?あなたの質問には多くのことを考慮する必要があります。プロパティの種類、列挙可能なもの、プロトタイプをここに混乱させる方法などを理解する必要があります。なぜ配列を使用しないのですか? – Sacho

+0

このqが重複とマークされていても、最初に尋ねられた質問に示された解決策がここで受け入れられた回答がより簡単に機能します。 –

答えて

80

優れたパフォーマンスと古いブラウザと新しいブラウザとの互換性を備えた最も簡単な方法は、ページにLo-DashまたはUnderscoreのいずれかを含めることです。あなたはobj.Dataについて_.size(object)または_.keys(object).length

のいずれかを使用することができます

次に、あなたがこれをテストできます。

console.log(_.size(obj.Data)); 

か:

console.log(_.keys(obj.Data).length); 

LO-ダッシュとアンダースコアは、両方の優れていますライブラリ;いずれかがコード内で非常に便利であることがわかります。 (彼らはお互いにかなり似ています。LO-ダッシュは、いくつかのadvantangesと新しいバージョンです。)

また、あなたは、単にオブジェクトのプロパティをループし、それらをカウントし、あなたのコードでこの関数を含めることができます

function ObjectLength(object) { 
    var length = 0; 
    for(var key in object) { 
     if(object.hasOwnProperty(key)) { 
      ++length; 
     } 
    } 
    return length; 
}; 

あなたはでこれをテストすることができます。コードは早く、それはしかし、最近のブラウザで可能性としてはないことを

console.log(ObjectLength(obj.Data)); 

。最近のブラウザでははるかに高速だと、まだ古いもので動作するバージョンについては、あなたが使用することができます。

function ObjectLength_Modern(object) { 
    return Object.keys(object).length; 
} 

function ObjectLength_Legacy(object) { 
    var length = 0; 
    for(var key in object) { 
     if(object.hasOwnProperty(key)) { 
      ++length; 
     } 
    } 
    return length; 
} 

var ObjectLength = 
    Object.keys ? ObjectLength_Modern : ObjectLength_Legacy; 

前と同様に、とそれをテスト:

console.log(ObjectLength(obj.Data)); 

このコードは、現代のブラウザでObject.keys(object).lengthを使用し、古いブラウザのループでカウントに戻ります。

しかし、あなたがこのすべての作業に行くなら、私は代わりにLo-DashまたはUnderscoreを使用し、それらのライブラリが提供するすべての利点を得ることをお勧めします。

jsPerf that compares the speed of these various approachesを設定しました。テストに追加するのに便利なブラウザで実行してください。

Barmarありがとうございました。回答はsuggesting Object.keys for newer browsersです。あなたが使用することができ、最近のブラウザで

+0

この種の特徴検出を行うために条件演算子を使用することは、過度に複雑に思われます。 –

+0

こんにちは、これについて説明できますか?これを関数に入れて、必要なときにいつでも呼び出すことができますか? 古いブラウザを使用しているユーザーに安全な予防策を講じるため、これを採用しようとします。 –

+1

これはかなり一般的な方法ですが、十分に公正なif文で簡単に同じことを行うことができます。主なことは、関数の内部ではなく関数の外で行うことです。 –

41

Object.keys(obj.Data).length 

マイケル・ゲーリーの答えにfor-inループを使用し、古いブラウザーについてMDN

を参照してください。

+0

こんにちはBarmar、どういうわけかコンソールの下ではログに記録されません...説明することで助けてくれますか? –

+0

'keys'は、カウントされるオブジェクトのプロパティではありません。 @BryanLearn:彼は 'Object.keys(obj.Data).length'を意味していました。とにかく二重引用符として閉じられるべきである:-) – Bergi

+0

これは答えです。 lodashのようなライブラリを追加することは、ソリューションの一部ではありません。また、期待通りの順序で出力するための 'for for'ループに頼ることもできません。 – BenRacicot

18

Demo Here

var list ={}; var count= Object.keys(list).length; 
+4

あなたはむしろソリューションを再投稿する代わりに、他の回答をupvoteする必要があります: – Bergi

+4

デモを始めると誰もこの回答を得ていませんでした。 – Sudarshan

関連する問題