2779

JavaScriptオブジェクトがあります。このオブジェクトの長さを取得するための組み込みまたは受け入れられているベストプラクティスの方法はありますか?

const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
4

42 に答える 42

3013

更新された回答

これは、2016年現在の更新と、ES5以降の広範な展開です IE9+およびその他すべての最新のES5+対応ブラウザーではObject.keys()、上記のコードが次のようになるように使用できます。

var size = Object.keys(myObj).length;

Object.keys()が組み込まれているため、既存のプロトタイプを変更する必要はありません。

編集:オブジェクトは、Object.keyメソッドを介して返すことができないシンボリックプロパティを持つことができます。したがって、それらに言及せずに答えは不完全になります。

オブジェクトプロパティの一意の識別子を作成するために、シンボルタイプが言語に追加されました。シンボルタイプの主な利点は、上書きを防ぐことです。

Object.keysまたはObject.getOwnPropertyNames、シンボリックプロパティでは機能しません。それらを返すには、を使用する必要がありますObject.getOwnPropertySymbols

var person = {
  [Symbol('name')]: 'John Doe',
  [Symbol('age')]: 33,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2

古い答え

最も堅牢な答え(つまり、バグを最小限に抑えながら実行しようとしていることの意図を捉える)は次のようになります。

Object.size = function(obj) {
  var size = 0,
    key;
  for (key in obj) {
    if (obj.hasOwnProperty(key)) size++;
  }
  return size;
};

// Get the size of an object
const myObj = {}
var size = Object.size(myObj);

JavaScriptには、さまざまなライブラリの列挙を壊す可能性があるため、Object.prototypeに何も追加しないという一種の規則があります。ただし、Objectにメソッドを追加することは通常安全です。


于 2008-08-09T08:31:04.577 に答える
1976

hasOwnPropertyチェックについて心配する必要がないことがわかっている場合は、次のようにObject.keys()メソッドを使用できます。

Object.keys(myArray).length
于 2011-04-03T01:44:24.820 に答える
304

更新: Underscore.jsを使用している場合(推奨、軽量です!)、次のようにできます。

_.size({one : 1, two : 2, three : 3});
=> 3

そうでなく、何らかの理由で Object プロパティをいじりたくなく、すでに jQuery を使用している場合は、プラグインにも同様にアクセスできます。

$.assocArraySize = function(obj) {
    // http://stackoverflow.com/a/6700/11236
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};
于 2012-07-05T14:39:00.947 に答える
65

これが最もクロスブラウザなソリューションです。

これは、存在する場合はネイティブの Object.keys を使用するため、受け入れられた回答よりも優れています。したがって、最新のすべてのブラウザで最速です。

if (!Object.keys) {
    Object.keys = function (obj) {
        var arr = [],
            key;
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {
                arr.push(key);
            }
        }
        return arr;
    };
}

Object.keys(obj).length;
于 2013-09-01T16:12:06.933 に答える
41

私は JavaScript の専門家ではありませんが、Object には length メソッドがないため、要素をループしてカウントする必要があるようです。

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }

@palmsey:OPに公平を期すために、JavaScriptのドキュメントでは、実際には、この方法でオブジェクト型の変数を「連想配列」として使用することを明示的に参照しています。

于 2008-08-07T19:52:19.840 に答える
35

このメソッドは、オブジェクトのすべてのプロパティ名を配列で取得するため、オブジェクトのキーの長さと等しい配列の長さを取得できます。

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2
于 2014-07-01T12:40:34.063 に答える
26

プロトタイプやその他のコードを台無しにしないために、独自のオブジェクトを作成して拡張できます。

function Hash(){
    var length=0;
    this.add = function(key, val){
         if(this[key] == undefined)
         {
           length++;
         }
         this[key]=val;
    }; 
    this.length = function(){
        return length;
    };
}

myArray = new Hash();
myArray.add("lastname", "Simpson");
myArray.add("age", 21);
alert(myArray.length()); // will alert 2

常に add メソッドを使用すると、長さのプロパティは正しくなります。あなたや他の人がそれを使用することを忘れているのが心配なら、他の人が投稿したプロパティ カウンターも length メソッドに追加できます。

もちろん、いつでもメソッドを上書きできます。しかし、そうしたとしても、コードはおそらく著しく失敗し、デバッグが容易になります。;)

于 2011-06-11T15:44:56.410 に答える
21

プロパティがプロトタイプチェーンにないことを確認することを忘れないでください:

var element_count = 0;
for(var e in myArray)
    if(myArray.hasOwnProperty(e))
        element_count++;
于 2008-08-08T19:18:45.143 に答える
20

これは、最新のブラウザー (Internet Explorer 9 以降、Chrome、Firefox 4 以降、Opera 11.60 以降、および Safari 5.1 以降) でのみ機能する、まったく異なるソリューションです。

この jsFiddleを参照してください。

連想配列クラスをセットアップする

/**
 * @constructor
 */
AssociativeArray = function () {};

// Make the length property work
Object.defineProperty(AssociativeArray.prototype, "length", {
    get: function () {
        var count = 0;
        for (var key in this) {
            if (this.hasOwnProperty(key))
                count++;
        }
        return count;
    }
});

これで、このコードを次のように使用できます...

var a1 = new AssociativeArray();
a1["prop1"] = "test";
a1["prop2"] = 1234;
a1["prop3"] = "something else";
alert("Length of array is " + a1.length);
于 2013-08-02T08:49:32.727 に答える
17

サイズを公開する連想データ構造が必要な場合は、オブジェクトの代わりにマップを使用することをお勧めします。

const myMap = new Map();

myMap.set("firstname", "Gareth");
myMap.set("lastname", "Simpson");
myMap.set("age", 21);

console.log(myMap.size); // 3

于 2016-05-18T18:16:07.027 に答える
16

使用する:

var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
obj = Object.keys(myArray).length;
console.log(obj)

于 2016-05-31T04:49:03.720 に答える
16

場合によっては、サイズを別の変数に格納する方がよい場合があります。特に、1 つの要素を 1 か所で配列に追加していて、サイズを簡単に増やすことができる場合は特にそうです。サイズを頻繁にチェックする必要がある場合は、明らかにはるかに高速に動作します。

于 2011-07-29T13:41:54.050 に答える
15

@palmsey:OPに公平を期すために、JavaScriptのドキュメントでは、実際には、この方法でオブジェクト型の変数を「連想配列」として使用することを明示的に参照しています。

そして、@palmseyに公平を期すために、彼は非常に正しかった. それらは連想配列ではありません。それらは間違いなくオブジェクトです:)-連想配列の仕事をしています。しかし、より広い点に関しては、私が見つけたこのかなり素晴らしい記事によると、あなたは間違いなくその権利を持っているようです:

有害と見なされる JavaScript の「連想配列」

しかし、これによると、受け入れられた答え自体は悪い習慣ですか?

Object のプロトタイプ size() 関数を指定する

Object .prototype に何か他のものが追加されている場合、提案されたコードは失敗します。

<script type="text/javascript">
Object.prototype.size = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
Object.prototype.size2 = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
alert("age is " + myArray["age"]);
alert("length is " + myArray.size());
</script>

同じ実行コンテキストで他のコードを実行している場合、その答えは信頼できないため、受け入れられるべきではないと思います。堅牢な方法でこれを行うには、myArray 内でサイズ メソッドを定義し、メンバーを反復処理するときにメンバーの型を確認する必要があります。

于 2008-08-08T22:34:56.557 に答える
12

このようなものはどうですか -

function keyValuePairs() {
    this.length = 0;
    function add(key, value) { this[key] = value; this.length++; }
    function remove(key) { if (this.hasOwnProperty(key)) { delete this[key]; this.length--; }}
}
于 2011-08-24T14:26:28.887 に答える
12

ハッシュがある場合

ハッシュ = {"a" : "b", "c": "d"};

ハッシュの長さであるキーの長さを使用して長さを取得できます。

キー (ハッシュ). 長さ

于 2014-02-09T06:48:50.453 に答える
11

AngularJS 1.x を使用している場合は、フィルターを作成し、次のような他の例のコードを使用することで、AngularJS の方法で物事を行うことができます。

// Count the elements in an object
app.filter('lengthOfObject', function() {
  return function( obj ) {
    var size = 0, key;
    for (key in obj) {
      if (obj.hasOwnProperty(key)) size++;
    }
   return size;
 }
})

使用法

コントローラーで:

$scope.filterResult = $filter('lengthOfObject')($scope.object)

またはあなたの見解では:

<any ng-expression="object | lengthOfObject"></any>
于 2015-09-15T19:15:04.340 に答える
9

上記のいくつかのバリエーションは次のとおりです。

var objLength = function(obj){    
    var key,len=0;
    for(key in obj){
        len += Number( obj.hasOwnProperty(key) );
    }
    return len;
};

これは、hasOwnProp を統合するもう少し洗練された方法です。

于 2011-11-18T18:06:41.627 に答える
9

Internet Explorer 8 以下のサポートを気にしない場合は、次の 2 つの手順を適用することで、オブジェクト内のプロパティの数を簡単に取得できます。

  1. Object.keys()列挙可能なプロパティの名前のみを含む配列を取得する場合、または列挙Object.getOwnPropertyNames()できないプロパティの名前も含めたい場合は、実行します。
  2. .lengthその配列のプロパティを取得します。

これを複数回行う必要がある場合は、このロジックを関数でラップできます。

function size(obj, enumerablesOnly) {
    return enumerablesOnly === false ?
        Object.getOwnPropertyNames(obj).length :
        Object.keys(obj).length;
}

この特定の機能の使用方法:

var myObj = Object.create({}, {
    getFoo: {},
    setFoo: {}
});
myObj.Foo = 12;

var myArr = [1,2,5,4,8,15];

console.log(size(myObj));        // Output : 1
console.log(size(myObj, true));  // Output : 1
console.log(size(myObj, false)); // Output : 3
console.log(size(myArr));        // Output : 6
console.log(size(myArr, true));  // Output : 6
console.log(size(myArr, false)); // Output : 7

デモについては、この Fiddleも参照してください。

于 2016-03-07T13:13:53.933 に答える
6

James Cogan の回答の別のバージョンを次に示します。引数を渡す代わりに、Object クラスのプロトタイプを作成し、コードをよりクリーンにします。

Object.prototype.size = function () {
    var size = 0,
        key;
    for (key in this) {
        if (this.hasOwnProperty(key)) size++;
    }
    return size;
};

var x = {
    one: 1,
    two: 2,
    three: 3
};

x.size() === 3;

jsfiddle の例: http://jsfiddle.net/qar4j/1/

于 2013-06-26T23:47:45.590 に答える
5

Object.keys(obj).length任意のオブジェクトで単純に使用して、その長さを取得できます。Object.keys は、すべてのオブジェクトキー(プロパティ) を含む配列を返します。これは、対応する配列の長さを使用してそのオブジェクトの長さを見つけるのに役立ちます。このための関数を作成することもできます。創造性を発揮して、そのためのメソッドも書きましょう(より便利な getter プロパティと共に):

function objLength(obj)
{
  return Object.keys(obj).length;
}

console.log(objLength({a:1, b:"summit", c:"nonsense"}));

// Works perfectly fine
var obj = new Object();
obj['fish'] = 30;
obj['nullified content'] = null;
console.log(objLength(obj));

// It also works your way, which is creating it using the Object constructor
Object.prototype.getLength = function() {
   return Object.keys(this).length;
}
console.log(obj.getLength());

// You can also write it as a method, which is more efficient as done so above

Object.defineProperty(Object.prototype, "length", {get:function(){
    return Object.keys(this).length;
}});
console.log(obj.length);

// probably the most effictive approach is done so and demonstrated above which sets a getter property called "length" for objects which returns the equivalent value of getLength(this) or this.getLength()

于 2016-09-17T01:48:20.517 に答える
3

財産

Object.defineProperty(Object.prototype, 'length', {
    get: function () {
        var size = 0, key;
        for (key in this)
            if (this.hasOwnProperty(key))
                size++;
        return size;
    }
});

使用する

var o = {a: 1, b: 2, c: 3};
alert(o.length); // <-- 3
o['foo'] = 123;
alert(o.length); // <-- 4
于 2015-01-06T19:10:35.450 に答える
3

以下は、まっすぐな JavaScript を放棄した人のための CoffeeScript での James Coglan の回答のバージョンです:)

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size
于 2013-03-04T17:38:43.470 に答える
2

ほとんどの JavaScript の問題と同様に、多くの解決策があります。良くも悪くも、他の多くの言語の辞書のように機能するオブジェクトを拡張できます (+ ファーストクラスの市民)。それは何も悪いことではありませんが、別のオプションは、特定のニーズを満たす新しいオブジェクトを作成することです。

function uberject(obj){
    this._count = 0;
    for(var param in obj){
        this[param] = obj[param];
        this._count++;
    }
}

uberject.prototype.getLength = function(){
    return this._count;
};

var foo = new uberject({bar:123,baz:456});
alert(foo.getLength());
于 2014-05-09T18:45:09.060 に答える
1

簡単な解決策:

  var myObject = {};      // ... your object goes here.

  var length = 0;

  for (var property in myObject) {
    if (myObject.hasOwnProperty(property)){
      length += 1;
    }
  };

  console.log(length);    // logs 0 in my example.
于 2015-04-11T14:33:17.950 に答える
0

このソリューションは、多くのケースとクロス ブラウザーで機能します。

コード

var getTotal = function(collection) {

    var length = collection['length'];
    var isArrayObject =  typeof length == 'number' && length >= 0 && length <= Math.pow(2,53) - 1; // Number.MAX_SAFE_INTEGER

    if(isArrayObject) {
        return collection['length'];
    }

    i= 0;
    for(var key in collection) {
        if (collection.hasOwnProperty(key)) {
            i++;
        }
    }

    return i;
};

データ例:

// case 1
var a = new Object();
a["firstname"] = "Gareth";
a["lastname"] = "Simpson";
a["age"] = 21;

//case 2
var b = [1,2,3];

// case 3
var c = {};
c[0] = 1;
c.two = 2;

使用法

getLength(a); // 3
getLength(b); // 3
getLength(c); // 2
于 2016-08-07T16:28:48.770 に答える
-2

WebSocket 経由で受信したオブジェクトが使用する帯域幅を計算する必要もありました。Stringified オブジェクトの長さを見つけるだけで十分でした。

websocket.on('message', data => {
    dataPerSecond += JSON.stringify(data).length;
}
于 2019-08-16T14:00:40.597 に答える