JavaScriptオブジェクトの要素の数を(どこかから)取得する方法はありますか?(つまり、一定時間の複雑さ)。
その情報を取得するプロパティまたはメソッドが見つかりません。これまでのところ、コレクション全体を反復処理することしか考えられませんが、それは線形時間です。
オブジェクトのサイズに直接アクセスできないのは奇妙なことです。
編集:
私はObject
オブジェクトについて話している(一般的なオブジェクトではない):
var obj = new Object ;
JavaScriptオブジェクトの要素の数を(どこかから)取得する方法はありますか?(つまり、一定時間の複雑さ)。
その情報を取得するプロパティまたはメソッドが見つかりません。これまでのところ、コレクション全体を反復処理することしか考えられませんが、それは線形時間です。
オブジェクトのサイズに直接アクセスできないのは奇妙なことです。
編集:
私はObject
オブジェクトについて話している(一般的なオブジェクトではない):
var obj = new Object ;
回答:
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対応の実装の場合、これは(Kudos to Avi Flax)としても記述できます。
function countProperties(obj) {
return Object.keys(obj).length;
}
列挙できないプロパティ(たとえば、配列length
)も見逃してしまうことに注意してください。
jQuery、Prototype、Mootools、$ whatever-the-newest-hypeなどのフレームワークを使用している場合は、独自のコレクションAPIが付属しているかどうかを確認します。これは、ネイティブJSオブジェクトを使用するよりも問題の解決策として適しています。
__count__
が廃止されました:(
hasOwnProperty()
ですか?
ES5互換の環境でこれを行うには
Object.keys(obj).length
(ここからのブラウザーサポート)
(Object.keysのドキュメントはこちら、非ECMA5ブラウザーに追加できるメソッドが含まれます)
ビルドですでにjQueryを使用している場合は、次のようにします。
$(yourObject).length
オブジェクトに対してはうまく機能し、依存関係としてすでにjQueryを使用していました。
申し訳ありませんが、アレイに切り替えない限り、これを確実に行う方法はありません。これは正直、しない奇妙に思える-それは配列が可算であることを私にはかなりまっすぐ進むようだだし、オブジェクトではありません。
おそらくあなたが得る最も近いものはこのようなものです
// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
var i = 0;
for ( var p in this ) i++;
return i;
}
alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3
しかし、これは問題、または少なくとも質問を作成します。_length関数自体を含む、すべてのユーザー作成プロパティがカウントされます!この単純な例では、通常の関数を使用するだけでそれを回避できますが、これは、他のスクリプトがこれを実行するのを停止できるという意味ではありません。それで、あなたは何をしますか?関数のプロパティを無視しますか?
Object.prototype.length = function()
{
var i = 0;
for ( var p in this )
{
if ( 'function' == typeof this[p] ) continue;
i++;
}
return i;
}
alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2
結局のところ、オブジェクトを数えることができるようにするという考えを捨て、自分がしていることを何でも行う別の方法を考えるべきだと思います。
数/長さ/次元の概念はオブジェクトにとって実際には意味がなく、それを必要とすることは本当に配列を私に望んでいることを示唆しています。
編集:これにはO(1)が必要であることを指摘しました。私の知る限りでは、そのような方法は存在しません。