126

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

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

編集:
私はObjectオブジェクトについて話しています(一般的なオブジェクトではありません):

var obj = new Object ;
4

6 に答える 6

183

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 オブジェクトを使用するよりも問題の解決策になる可能性があります。

于 2009-06-05T16:35:04.387 に答える
129

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

Object.keys(obj).length

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

于 2013-03-15T09:03:09.257 に答える
7
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);
于 2009-06-05T17:02:56.880 に答える
1

私の知る限り、配列に切り替えない限り、これを確実に行う方法はありません。正直なところ、これは奇妙に思えません。配列は可算で、オブジェクトは可算でないというのは、私にはかなり単純明快に思えます

おそらくあなたが得る最も近いのはこのようなものです

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

最終的には、オブジェクトを数えられるようにするという考えを捨てて、何をしていても別の方法を考え出す必要があると思います。

于 2009-06-05T16:27:31.890 に答える
0

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

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

于 2009-06-05T16:21:31.983 に答える