web-dev-qa-db-ja.com

javascriptオブジェクトの要素の数

Javascriptオブジェクトの要素の数を(どこかから)取得する方法はありますか?? (つまり、一定時間の複雑さ)。

その情報を取得するプロパティまたはメソッドが見つかりません。これまでのところ、コレクション全体を反復処理することしか考えられませんが、それは線形時間です。
オブジェクトのサイズに直接アクセスできないのはおかしいと思います。

編集:
私はObjectオブジェクト(一般的なオブジェクトではない)について話している:

var obj = new Object ;
95
GetFree

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、$ whatever-the-newest-hypeのようなフレームワークを使用している場合は、独自のコレクションAPIが付属しているかどうかを確認してください。

143
Christoph

ES5互換環境でこれを行うには

Object.keys(obj).length

here からのブラウザサポート)
(Object.keysのドキュメント ここ 、非ECMA5ブラウザーに追加できるメソッドが含まれています)

86
ZelkiN

ifビルドですでにjQueryを使用している場合は、次のようにします。

$(yourObject).length

オブジェクトに対してはうまく機能し、jQueryを依存関係として既に持っていました。

11
IndelibleHeff
function count(){
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;
}

var O={a: 1, b: 2, c: 3};

count.call(O);
5
kennebec

私の知る限り、配列に切り替えない限り、これを確実に行う方法はありません。正直なところ、does n'tは奇妙に思えます-配列は可算であり、オブジェクトは可算ではないことは、私にとってはとても簡単です。

おそらく最も近いものはこのようなものです

// 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

最終的には、オブジェクトをカウント可能にするという考えを捨てて、あなたがしていることを何でもする別の方法を見つけ出すべきだと思います。

2
Peter Bailey

数値/長さ/次元の概念はオブジェクトにとって実際には意味がありません。それを必要とすることは、本当に配列が欲しいことを示唆しています。

編集:これにはO(1)が必要だと指摘しました。私の知る限り、そのような方法は存在しません。

1
annakata