コレクション - JavaScriptオブジェクト内の要素の数
Javascriptオブジェクトの要素数を(どこかから)取得する方法はありますか?(すなわち定数時間の複雑さで)。
その情報を取得するプロパティやメソッドが見つかりません。今のところ、全てのコレクションを繰り返し処理するしか思いつきませんが、それは線形時間です。
オブジェクトのサイズに直接アクセスできないのは不思議ですね、そう思いませんか。
追記:
私が話しているのは Object オブジェクトのことです(一般的なオブジェクトではありません):
var obj = new Object ;
回答 #1
JSの実装はそのような値を内部的に追跡しているかもしれませんが、それを取得する標準的な方法はありません。
過去には、Mozilla の JavaScript のバリアントは非標準の __count__ を公開していましたが、バージョン 1.8.5 で削除されました。
クロスブラウザのスクリプティングでは、プロパティを明示的に反復処理し、hasOwnProperty() をチェックするしかありません:
function countProperties(obj) {
var count = 0;
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
++count;
}
return count;
}
ECMAScript 5 対応の実装の場合、これは次のようにも書くことができます(Avi Flax に敬意を表して)
function countProperties(obj) {
return Object.keys(obj).length;
}
また、列挙不可能なプロパティ(例:配列のlength)も見逃すことになることを覚えておいてください。
もし jQuery、Prototype、Mootools、または最新の流行フレームワークのようなものを使用している場合、それらが独自のコレクションAPIを備えているか確認してください。これは、ネイティブのJSオブジェクトを使用するよりもあなたの問題に対するより良い解決策かもしれません。
回答 #2
任意のES5互換環境でこれを行うために
Object.keys(obj).length
(ブラウザのサポートはこちら)
(Object.keys に関するドキュメントはこちら、ECMA5 非対応ブラウザに追加できるメソッドも含む)
回答 #3
もしすでにビルドで jQuery を使用している場合は、次のようにしてください:
$(yourObject).length
オブジェクトではうまく動作しますし、すでに jQuery を依存関係として持っていました。
