JavaScript オブジェクトのプロパティを列挙するにはどうすればよいですか?
実際には、定義済みのすべての変数とその値を一覧表示したいのですが、変数を定義すると、実際にはウィンドウ オブジェクトのプロパティが作成されることを学びました。
JavaScript オブジェクトのプロパティを列挙するにはどうすればよいですか?
実際には、定義済みのすべての変数とその値を一覧表示したいのですが、変数を定義すると、実際にはウィンドウ オブジェクトのプロパティが作成されることを学びました。
簡単です:
for(var propertyName in myObject) {
// propertyName is what you want
// you can get the value like this: myObject[propertyName]
}
現在、プライベート変数は使用できないため、この方法では取得できません。
編集: @bitwiseplatypusは、メソッドを使用しない限りhasOwnProperty()
、継承されたプロパティを取得することは正しいですが、オブジェクト指向プログラミングに精通している人がそれ以下のものを期待する理由はわかりません! 通常、これを持ち出す人は、これに関する Douglas Crockford の警告を受けていますが、それでも少し混乱しています。繰り返しになりますが、継承は OO 言語の通常の部分であり、したがって JavaScript の一部ですが、プロトタイプではあります。
そうは言っても、フィルタリングにhasOwnProperty()
は便利ですが、継承されたプロパティを取得する際に何か危険があるかのように警告を発する必要はありません。
編集 2: @bitwiseplatypusは、(プロトタイプを介して) 最初にオブジェクトを作成したときよりも後の時点で誰かがオブジェクトにプロパティ/メソッドを追加した場合に発生する状況を提起します - これが予期しない動作を引き起こす可能性があることは事実ですが、私は個人的にそれを完全に私の問題とは考えていません。意見の問題です。さらに、オブジェクトの構築中にプロトタイプを使用するような方法で物事を設計し、オブジェクトのプロパティを反復処理するコードがあり、継承されたすべてのプロパティが必要な場合はどうすればよいでしょうか? 私は使用しませんhasOwnProperty()
。次に、後で誰かが新しいプロパティを追加するとします。その時点で物事がうまくいかない場合、それは私のせいですか?私はそうは思わない。これが、例として、jQuery がその動作方法を拡張する方法を指定した理由だと思います (jQuery.extend
とjQuery.fn.extend
)。
ループを使用しfor..in
てオブジェクトのプロパティを列挙しますが、注意してください。列挙は、列挙されているオブジェクトだけでなく、親オブジェクトのプロトタイプからもプロパティを返します。
var myObject = {foo: 'bar'};
for (var name in myObject) {
alert(name);
}
// results in a single alert of 'foo'
Object.prototype.baz = 'quux';
for (var name in myObject) {
alert(name);
}
// results in two alerts, one for 'foo' and one for 'baz'
継承されたプロパティを列挙に含めないようにするには、次を確認してくださいhasOwnProperty()
。
for (var name in myObject) {
if (myObject.hasOwnProperty(name)) {
alert(name);
}
}
編集:継承されたプロパティの列挙について心配する必要はないという JasonBunting の声明には同意しません。コードの動作が変更される可能性があるため、予期しない継承されたプロパティを列挙することには危険があります。
この問題が他の言語に存在するかどうかは問題ではありません。オブジェクトのプロトタイプへの変更は、インスタンス化後に変更が行われた場合でも子オブジェクトに影響するため、JavaScript は特に脆弱です。
これが JavaScript が を提供する理由hasOwnProperty()
であり、サード パーティのコード (またはプロトタイプを変更する可能性のあるその他のコード) があなたのコードを壊さないようにするために JavaScript を使用する必要がある理由です。数バイトのコードを追加する以外に、を使用することのマイナス面はありませんhasOwnProperty()
。
すでに数回提案されている標準的な方法は次のとおりです。
for (var name in myObject) {
alert(name);
}
ただし、Internet Explorer 6、7、および 8 には JavaScript インタープリターにバグがあり、一部のキーが列挙されないという影響があります。このコードを実行すると:
var obj = { toString: 12};
for (var name in obj) {
alert(name);
}
IE を除くすべてのブラウザで "12" を警告する場合。IE はこのキーを無視します。影響を受けるキー値は次のとおりです。
isPrototypeOf
hasOwnProperty
toLocaleString
toString
valueOf
IE で本当に安全にするには、次のようなものを使用する必要があります。
for (var key in myObject) {
alert(key);
}
var shadowedKeys = [
"isPrototypeOf",
"hasOwnProperty",
"toLocaleString",
"toString",
"valueOf"
];
for (var i=0, a=shadowedKeys, l=a.length; i<l; i++) {
if map.hasOwnProperty(a[i])) {
alert(a[i]);
}
}
幸いなことに、EcmaScript 5 ではObject.keys(myObject)
オブジェクトのキーを配列として返す関数が定義されており、一部のブラウザー (Safari 4 など) では既に実装されています。
最新のブラウザー (ECMAScript 5) で列挙可能なすべてのプロパティを取得するには、次のようにします。
Object.keys(obj) (古いブラウザーでの後方互換性のためのスニペットを取得するには、リンクを確認してください)
または、列挙不可能なプロパティも取得するには:
Object.getOwnPropertyNames(obj)
追加情報: 列挙可能な属性とは何ですか?
私を驚かせた事例の例は適切だと思います。
var myObject = { name: "Cody", status: "Surprised" };
for (var propertyName in myObject) {
document.writeln( propertyName + " : " + myObject[propertyName] );
}
しかし、驚いたことに、出力は
name : Cody
status : Surprised
forEach : function (obj, callback) {
for (prop in obj) {
if (obj.hasOwnProperty(prop) && typeof obj[prop] !== "function") {
callback(prop);
}
}
}
なんで?このページの別のスクリプトは、オブジェクトのプロトタイプを拡張しました。
Object.prototype.forEach = function (obj, callback) {
for ( prop in obj ) {
if ( obj.hasOwnProperty( prop ) && typeof obj[prop] !== "function" ) {
callback( prop );
}
}
};
for (prop in obj) {
alert(prop + ' = ' + obj[prop]);
}
簡単な JavaScript コード:
for(var propertyName in myObject) {
// propertyName is what you want.
// You can get the value like this: myObject[propertyName]
}
jQuery:
jQuery.each(obj, function(key, value) {
// key is what you want.
// The value is in: value
});
オブジェクトのプロパティを列挙する方法は次のとおりです。
var params = { name: 'myname', age: 'myage' }
for (var key in params) {
alert(key + "=" + params[key]);
}
私はそれを見つけました...for (property in object) { // do stuff }
すべてのプロパティをリストするため、ウィンドウオブジェクトでグローバルに宣言されたすべての変数がリストされます..
Underscore.jsライブラリを使用している場合は、ファンクションキーを使用できます。
_.keys({one : 1, two : 2, three : 3});
=> ["one", "two", "three"]
オブジェクトに対して新しいコードを記述するためにプロパティを列挙しようとしている場合は、Firebug などのデバッガを使用してそれらを視覚的に確認することをお勧めします。
もう 1 つの便利な手法は、Prototype の Object.toJSON() を使用してオブジェクトを JSON にシリアル化することです。これにより、プロパティ名と値の両方が表示されます。
var data = {name: 'Violet', occupation: 'character', age: 25, pets: ['frog', 'rabbit']};
Object.toJSON(data);
//-> '{"name": "Violet", "occupation": "character", "age": 25, "pets": ["frog","rabbit"]}'