JavaScriptオブジェクトの長さ


2384

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

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

15
javascriptのオブジェクトリテラルは、デフォルトでは連想配列です。たとえば、object.propertyName.propertyValueは、object [propertyName] [propertyValue]と同じです
neitony

6
これを実行するUnderscore.jsのワンライナーを追加:stackoverflow.com/a/11346637/11236
ripper234

31
行の答えが出たら、@ aeosynthが言ったようにObject.keys(myArray).lengthを使用します。
Ranadheer Reddy 2013

67
OK、いかがですかObject.keys(obj).length
Muhammad Umer、2015

5
object.lengthが有効でないのはなぜですか?それは私にとって正しい結果を返します。
エイドリアンM

回答:


2624

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

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
var size = Object.size(myObj);

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


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

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

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

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

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

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

65
@Tres -それはそれはすでに定義されていた場合、常に価値チェックですので、誰かが来て、あなたを知らなくても、「サイズ」プロパティをオーバライドならば、あなたのコードを分けることができますが、すでにどこかのコードでそれを宣言
VSYNC

19
@vsyncあなたはとても正しいです。必要な健全性チェックを常に実装する必要があります:)
Tres

132
なぜ誰もがこれを無視しているのですか?Object.keys(obj).length
ムハンマドウメール2015

33
@MuhammadUmerおそらく、この回答が書かれたときにそのメソッドは存在しなかったためです。今日でも、それを使用するにはおそらく古いブラウザーのポリフィルが必要になります。
Chris Hayes

21
@stonyau IE8、IE9、IE10は、マイクロソフトからのサポートを得られない死んだブラウザーです。IE8、IE9、IE10のユーザーは、サポートされていない古いブラウザーを使用しているため、Microsoftから通知を受け取ります。support.microsoft.com/en-us/kb/3123303
Lukas Liesis

1708

hasOwnPropertyチェックについて心配する必要がないことがわかっている場合、これは非常に簡単に行うことができます。

Object.keys(myArray).length

23
何故なの?:私が知っているから、それが標準ですdeveloper.mozilla.org/en/JavaScript/Reference/Global_Objects/...
VSYNC

104
普遍的に実装されている方法ではありませんが、この表でどのブラウザがサポートしているかを確認できます
aeosynth

51
IE8のサポートなし=いいえ。
ripper234 2012年

22
firefoxに切り替える時間=残念ながら、切り替えてもウェブサイトのユーザーがそうするわけではありません...
mdup

82
@ ripper234 IEサポートなし=ポリフィルする時間
John Dvorak

287

更新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;
};

7
_.size()underscore.jsをサポートするMeteorプロジェクトの完璧なソリューションでした。
tokyovariable 2013

4
私はアンダースコアを使用していますが、この投稿は、このプロジェクトではアンダースコアを十分に使用していないことを思い出させてくれました。オブジェクトを処理する場合は、underscore.jsを使用できる必要があります。
jbolanos 2013年

3
アンダースコア>(すべて-['lo-dash'])
Rayjax 14

underscorejs、jsの下にあるべきもの:)
minhajul

1
@Babydeadを使用して、オブジェクトの実際のプロパティと継承されたプロパティを区別します。developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
ripper234

56

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

ネイティブ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;

6
Object.keys()列挙可能なプロパティのみの名前を含む配列を返します。ALLプロパティを持つ配列が必要な場合は、Object.getOwnPropertyNames()代わりに使用する必要があります。developer.mozilla.org/en/docs/Web/JavaScript/Reference/…を
John Slegers 2016年

35

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

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

@palmsey:OPに公平を期して、JavaScriptのドキュメントでは、Object型の変数をこの方法で "連想配列"として明示的に参照しています。


8
プロトタイプを介して追加されるメソッドもカウントするため、機能しません。
Lajos Meszaros 2013年

30

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

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2

@PatrickRoberts keysメソッドは、プロトタイプチェーンからプロパティを返しません。なぜここでhasOwnPropertyが必要なのか。また、長さが配列などにあるため、getOwnPropertyは非表示のプロパティを返します
Muhammad Umer

24

プロトタイプやその他のコードをいじらないようにするには、独自のオブジェクトを作成して拡張します。

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メソッドに追加することもできます。

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


これは、配列が大きい場合にコストがかかる可能性がある「for」でループする必要がないため、最良の解決策だと思います
Emeka Mbah

20

プロパティがプロトタイプチェーンにないことを確認する方法と方法を次に示します。

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

20

単にこれを使用してlength

Object.keys(myObject).length

7
あなたの答えがstackoverflow.com/a/6700/8632727
Patata

3
また、実際にオブジェクトに名前を付けることもできませんmyArray
バリーマイケルドイル

2
@BarryMichaelDoyle私はそれを変更しました:)
saurabhgoyal795 2018年

いいですね、変数には実際の名前に基づいて名前を付ける方が常に良いでしょう。他の開発者がコードを読みやすくします。
バリーマイケルドイル

4
"myArray"-> "myObject"編集の前は、これは2番目に高い賛成投票の回答と同じでした。
ユンノシュ

16

これは、より新しいブラウザー(IE9以降、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);

それは安全ではないと思います。たとえば、「長さ」のキーを持つ要素は使用できません。ステートメントa1 ["長さ"] = "Hello world"; エントリの保存に失敗しました。また、ステートメントa1 ["hasOwnProperty"] = "some prop"; 完全に機能を壊す
Panos Theof 2014年

3
@PanosTheof lengthプロパティを使用した場合、値を格納する必要はないと思います。それを使用したコードでは、それが試行および格納されないことを確認する必要がありlengthますが、それが同じだったと思います標準配列も。hasOwnPropertyオブジェクトをオーバーライドすると、望ましくない結果が生じる可能性があります。
アリー

16

<script>
myObj = {"key1" : "Hello", "key2" : "Goodbye"};
var size = Object.keys(myObj).length;
console.log(size);
</script>

<p id="myObj">The number of <b>keys</b> in <b>myObj</b> are: <script>document.write(size)</script></p>

これは私にとってはうまくいきます:

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

15

場合によっては、サイズを別の変数に格納する方が良い場合があります。特に、1つの要素を1つの場所で配列に追加していて、サイズを簡単に増やすことができる場合。サイズを頻繁に確認する必要がある場合は、明らかにはるかに速く機能します。



14

@palmsey:OPに公平を期して、JavaScriptドキュメントでは、Object型の変数をこの方法で "連想配列"として明示的に参照しています。

そして、@ 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内でsizeメソッドを定義し、メンバーを反復処理しながらメンバーのタイプを確認する必要があります。


13

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

const myMap = new Map();
myMap.set("firstname", "Gareth");
myMap.set("lastname", "Simpson");
myMap.set("age", 21);
myMap.size; // 3

11

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

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--; }}
}

11

ハッシュがあれば

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

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

keys(hash).length


2
これは素晴らしい答えですが、このキー機能のドキュメントは見つかりません。そのため、クロスブラウザーのサポートに自信がありません。
2015

1
残念ながら、これは私が最初に思ったほど良い答えではありません!キー機能はchromeおよびfirefox Webコンソールでのみ使用できることがわかりました。このコードをスクリプトに挿入すると、Uncaught ReferenceErrorで失敗します。キーが定義されていません
Chim


1
これはaeosynthの回答とどう違うのですか?
Peter Mortensen 2016

11
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
  1. Object.values(myObject).length
  2. Object.entries(myObject).length
  3. Object.keys(myObject).length

どちら3.上記の中でも高速です
siluveruキラン・クマール

Object.values(myObject).length
tdjprog

どのように我々は言うことができる、それObject.values(myObjectという).LENGTHは高速である任意の例のおかげで、@tdjprogがあります
siluveruキラン・クマール

コンソールでこれを試してください:var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
tdjprog

なぜObject.values(myObject).lengthの方が速いのですか?Object.entries(myObject).lengthとして、しばらくしても出力が出ないのはなぜですか? ありがとう@tdjprog
siluveru kiran kumar

10

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>

4
OPはAngularJSバージョンを要求していません。これは質問に対する有効な回答ではありません。
Francisco Hodge


8

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

デモについては、このフィドルも参照してください。


8

Object.keys(myObject).lengthオブジェクト/配列の長さを取得するために使用します

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

console.log(Object.keys(myObject).length); //3

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

console.log(Object.keys(myObject).length)

// o/p 3

7

上記の一部のバリエーションは次のとおりです。

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

これは、hasOwnPropを統合するためのもう少しエレガントな方法です。


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/


6
Object.prototype- 悪いアイデア。
Dziad Borowy 2013年

@tborychowski理由を教えてください。
モハマド2014年

これが1つの記事です:bit.ly/1droWrG。これを行う前に、すべての影響を知っておく必要があるだけで、それを行ってはいけないと言っているのではありません。
Dziad Borowy 2014年

組み込みプロトタイプを拡張するか、プロパティ(つまり、モンキーパッチ)をポリフィルする場合は、正しく実行してください。前方互換性のために、まずプロパティが存在するかどうかを確認し、次にプロパティを列挙不可にして、独自のキーが構築されたオブジェクトの汚染されていません。メソッドには実際の メソッドを使用します。私の推奨事項:次の例に従って組み込みメソッドのようにできるだけ近くで動作するメソッドを追加する方法を示します。
user4642212

5

あなたは単に使うことができます Object.keys(obj).length任意のオブジェクトでして、その長さを取得できます。Object.keysは、対応する配列の長さを使用してそのオブジェクトの長さを見つけるのに便利なすべてのオブジェクトキー(プロパティ)を含む配列を返します。このための関数を書くこともできます。さんが取得してみましょう創造と書き込み方法を(もっとconvienientゲッタープロパティと一緒に)だけでなく、それのために:

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()


3
これはaeosynthの回答とどう違うのですか?
Peter Mortensen

これは、関数およびグローバルオブジェクトメソッドとして作成する方法を示しているためです(よりオブジェクト指向で、何らかの形のカプセル化を使用します)。しかし、aeosynthの答え違います。
神秘的な2016

組み込みのプロトタイプを拡張する場合、またはプロパティ(つまり、モンキーパッチ)をポリフィルする場合は、正しく実行してください。前方互換性のために、プロパティが最初に存在するかどうかを確認し、次にプロパティを列挙不可にして、独自のキーが構築されたオブジェクトの汚染されていません。メソッドには実際の メソッドを使用します。私の推奨事項:次の例に従って組み込みメソッドのようにできるだけ近くで動作するメソッドを追加する方法を示します。
user4642212

また、メソッドの記述はどのように「より効率的」ですか。
user4642212

5

通常の配列の場合Object.getOwnPropertyNames(myObject).lengthと同じ結果を得るには、いつでも行うことができ[].lengthます。


1
Object.keys()列挙可能なプロパティのみの名前を含む配列を返します。ALLプロパティを持つ配列が必要な場合は、Object.getOwnPropertyNames()代わりに使用する必要があります。developer.mozilla.org/en/docs/Web/JavaScript/Reference/…を
John Slegers 2016年

3
これはaeosynthの回答とどう違うのですか?
Peter Mortensen 2016

4

Objectの長さは次のようにして調べることができます。

Object.values(myObject).length

4

ゲームには少し遅れますが、これを実現するための良い方法(IE9 +のみ)は、lengthプロパティにマジックゲッターを定義することです。

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

そして、あなたはそれを次のように使うことができます:

var myObj = { 'key': 'value' };
myObj.length;

与えるでしょう1


1
プロトタイプの変更に反対する議論はさておき、私は個人的にはそれによって引き起こされるバグを経験したことがなく、私にとってJavaScriptの強みの1つです。
MacroMan、

3

以下は、ストレートJavaScriptを放棄した人のための、CoffeeScriptでのJames Coglanの回答のバージョンです。

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size

1
おそらくあなたは言いたかったでしょうsize++ for own key of objown keyCoffeeScriptの構文シュガー)。hasOwnPropertyオブジェクトが実際にそのようなプロパティを持っていると壊れるので、オブジェクトから直接使用するのは危険です。
Konrad Borowski、2013

2
OPはCoffeeScriptバージョンを要求しませんでしたし、そのようにタグ付けされていません。これは質問に対する有効な回答ではありません。
Francisco Hodge
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.