私はJavaScriptオブジェクトを持っていますが、このオブジェクトの長さを取得するための組み込みまたは受け入れられたベストプラクティスの方法はありますか?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
Object.keys(obj).length
私はJavaScriptオブジェクトを持っていますが、このオブジェクトの長さを取得するための組み込みまたは受け入れられたベストプラクティスの方法はありますか?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
Object.keys(obj).length
回答:
最も堅牢な答え(つまり、バグを最小限に抑えながら実行しようとしていることの意図を捉えたもの)は次のようになります。
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
Object.keys(obj).length
hasOwnProperty
チェックについて心配する必要がないことがわかっている場合、これは非常に簡単に行うことができます。
Object.keys(myArray).length
更新: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;
};
_.size()
underscore.jsをサポートするMeteorプロジェクトの完璧なソリューションでした。
これが最もクロスブラウザなソリューションです。
ネイティブ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;
Object.keys()
列挙可能なプロパティのみの名前を含む配列を返します。ALLプロパティを持つ配列が必要な場合は、Object.getOwnPropertyNames()
代わりに使用する必要があります。developer.mozilla.org/en/docs/Web/JavaScript/Reference/…を
私はJavaScriptの専門家ではありませんが、Objectにはlengthメソッドがないため、要素をループして数える必要があるようです。
var element_count = 0;
for (e in myArray) { if (myArray.hasOwnProperty(e)) element_count++; }
@palmsey:OPに公平を期して、JavaScriptのドキュメントでは、Object型の変数をこの方法で "連想配列"として明示的に参照しています。
このメソッドは、配列内のすべてのオブジェクトのプロパティ名を取得するため、オブジェクトのキーの長さに等しい配列の長さを取得できます。
Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2
プロトタイプやその他のコードをいじらないようにするには、独自のオブジェクトを作成して拡張します。
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メソッドに追加することもできます。
もちろん、いつでもメソッドを上書きすることができます。しかし、たとえそうしたとしても、コードはおそらく著しく失敗し、デバッグが容易になります。;)
単にこれを使用してlength
:
Object.keys(myObject).length
myArray
これは、より新しいブラウザー(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);
length
プロパティを使用した場合、値を格納する必要はないと思います。それを使用したコードでは、それが試行および格納されないことを確認する必要がありlength
ますが、それが同じだったと思います標準配列も。hasOwnProperty
オブジェクトをオーバーライドすると、望ましくない結果が生じる可能性があります。
<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;
場合によっては、サイズを別の変数に格納する方が良い場合があります。特に、1つの要素を1つの場所で配列に追加していて、サイズを簡単に増やすことができる場合。サイズを頻繁に確認する必要がある場合は、明らかにはるかに速く機能します。
使用する:
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
obj = Object.keys(myArray).length;
console.log(obj)
@palmsey:OPに公平を期して、JavaScriptドキュメントでは、Object型の変数をこの方法で "連想配列"として明示的に参照しています。
そして、@ palmseyに公平を期して、彼は完全に正しかった、それらは連想配列ではなく、それらは間違いなくオブジェクトです:)-連想配列の仕事をしています。しかし、より広い点に関しては、私が見つけたこのかなり良い記事によれば、あなたは間違いなくそれの権利を持っているようです:
しかし、これによると、受け入れられた答え自体は悪い習慣ではないでしょうか?
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メソッドを定義し、メンバーを反復処理しながらメンバーのタイプを確認する必要があります。
ハッシュがあれば
ハッシュ= {"a": "b"、 "c": "d"};
ハッシュの長さであるキーの長さを使用して長さを取得できます。
keys(hash).length
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
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>
Internet Explorer 8以下をサポートする必要がない場合は、次の2つの手順を適用することで、オブジェクトのプロパティの数を簡単に取得できます。
Object.keys()
ているだけで、これらのプロパティの名前が含まれている配列を取得するために、列挙またはObject.getOwnPropertyNames()
あなたがしたい場合にも列挙されないプロパティの名前が含まれています。.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
デモについては、このフィドルも参照してください。
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/
Object.prototype
- 悪いアイデア。
あなたは単に使うことができます 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()
通常の配列の場合Object.getOwnPropertyNames(myObject).length
と同じ結果を得るには、いつでも行うことができ[].length
ます。
Object.keys()
列挙可能なプロパティのみの名前を含む配列を返します。ALLプロパティを持つ配列が必要な場合は、Object.getOwnPropertyNames()
代わりに使用する必要があります。developer.mozilla.org/en/docs/Web/JavaScript/Reference/…を
ゲームには少し遅れますが、これを実現するための良い方法(IE9 +のみ)は、lengthプロパティにマジックゲッターを定義することです。
Object.defineProperty(Object.prototype, "length", {
get: function () {
return Object.keys(this).length;
}
});
そして、あなたはそれを次のように使うことができます:
var myObj = { 'key': 'value' };
myObj.length;
与えるでしょう1
。
以下は、ストレートJavaScriptを放棄した人のための、CoffeeScriptでのJames Coglanの回答のバージョンです。
Object.size = (obj) ->
size = 0
size++ for own key of obj
size
size++ for own key of obj
(own key
CoffeeScriptの構文シュガー)。hasOwnProperty
オブジェクトが実際にそのようなプロパティを持っていると壊れるので、オブジェクトから直接使用するのは危険です。