回答:
最新のブラウザー(IE9 +、FF4 +、Chrome5 +、Opera12 +、Safari5 +)では、組み込みのObject.keysメソッドを使用できます。
var keys = Object.keys(myObject);
上記は完全なポリフィルですが、簡略化されたバージョンは次のとおりです。
var getKeys = function(obj){
var keys = [];
for(var key in obj){
keys.push(key);
}
return keys;
}
または、var getKeys
と置き換えて、任意のオブジェクトObject.prototype.keys
を呼び出すこと.keys()
ができます。プロトタイプの拡張にはいくつかの副作用があり、私はそれを行うことをお勧めしません。
for (var key in myObject) {...}
手法は、ブラウザーやV8以外のJavaScriptランタイムで役立ちます。たとえば、JavaScriptのmap-reduceクエリをRiakに渡す場合、Object
オブジェクトは存在しないため、Object.keys
メソッドは使用できません。
Object.keys
メソッドは、オブジェクト自体のプロパティのみを返します。それは重要な違いだと思います。
以下のようslashnickは指摘し、あなたはその属性名のオブジェクトを反復処理するために構築物「には、」使用することができます。ただし、オブジェクトのプロトタイプチェーンのすべての属性名を繰り返し処理します。オブジェクト自体の属性のみを反復処理する場合は、Object#hasOwnProperty()メソッドを使用できます。したがって、次のようになります。
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
/* useful code here */
}
}
esc
オブジェクトには約100万のプロパティがあり、そのほとんどが使用されておらず、アラートがあったため、キーを押したまま15分間費やす必要がありました。
サム・ダットンが答えたように、まさにこの目的のための新しい方法がECMAScript 5th Editionに導入されました。 Firefox 4、Chrome 6、Safari 5、IE 9でObject.keys()
サポートされています。
また、このメソッドをサポートしていないブラウザでメソッドを非常に簡単に実装することもできます。ただし、一部の実装では、Internet Explorerとの完全な互換性がありません。より互換性のあるソリューションを次に示します。
Object.keys = Object.keys || (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !{toString:null}.propertyIsEnumerable("toString"),
DontEnums = [
'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty',
'isPrototypeOf', 'propertyIsEnumerable', 'constructor'
],
DontEnumsLength = DontEnums.length;
return function (o) {
if (typeof o != "object" && typeof o != "function" || o === null)
throw new TypeError("Object.keys called on a non-object");
var result = [];
for (var name in o) {
if (hasOwnProperty.call(o, name))
result.push(name);
}
if (hasDontEnumBug) {
for (var i = 0; i < DontEnumsLength; i++) {
if (hasOwnProperty.call(o, DontEnums[i]))
result.push(DontEnums[i]);
}
}
return result;
};
})();
現在受け入れられている回答には、hasOwnProperty()のチェックが含まれておらず、プロトタイプチェーンを通じて継承されるプロパティが返されることに注意してください。また、Internet Explorerの有名なDontEnumバグについても説明していません。プロトタイプチェーンの列挙できないプロパティが原因で、同じ名前のローカルで宣言されたプロパティがDontEnum属性を継承します。
Object.keys()を実装すると、より堅牢なソリューションが得られます。
編集: Prototypeの有名な貢献者であるkangaxとの最近の議論に続いて、私Object.forIn()
はここにある彼の関数のコードに基づいてDontEnumバグの回避策を実装しました。
Object.prototype
ます。ただし、短いコードの方が大きくて堅牢なコードよりもはるかに魅力的であるように見えることがよくありますが、この答えのポイントはObject.keys()
、このコードを使用してそれをサポートしないブラウザーに実装できるECMAScript 5thを使用することです。ネイティブバージョンは、これよりもさらにパフォーマンスが高くなります。
Object.keys
対応する文字列の配列しか返さないことを思い出したいと思います-このスレッドでは誰も言及していません- これは、ネイティブ(ユーザー定義)オブジェクトを操作する場合は重要ではないかもしれませんが、ホストオブジェクトで非常によく見えるはずです(ただし、指定されていないホストオブジェクトの動作は別の—痛い—ストーリーです)。すべての(列挙できないものを含む)プロパティを列挙するために、ES5は提供しています(互換性の表でサポートを参照してください。kangax.github.com/es5 -compat- table)Object.getOwnPropertyNames
Object.keys(stuff)
ているのstuff.keys()
か、そうでないのかを誰かが説明できますか?
Object.keysおよびその他のECMAScript 5メソッドは、Firefox 4、Chrome 6、Safari 5、IE 9以降でサポートされています。
例えば:
var o = {"foo": 1, "bar": 2};
alert(Object.keys(o));
ECMAScript 5互換性テーブル:http : //kangax.github.com/es5-compat-table/
新しいメソッドの説明:http : //markcaudill.com/index.php/2009/04/javascript-new-features-ecma5/
Object.getOwnPropertyNames(obj)
この関数は、で表示されるプロパティに加えて、列挙不可能なプロパティも表示しObject.keys(obj)
ます。
JSでは、すべてのプロパティにブール値を含むいくつかのプロパティがありますenumerable
。
一般に、列挙できないプロパティはより「内部的」であり、あまり使用されませんが、実際に何が起こっているかを確認するために時々それらを調べることは洞察力があります。
例:
var o = Object.create({base:0})
Object.defineProperty(o, 'yes', {enumerable: true})
Object.defineProperty(o, 'not', {enumerable: false})
console.log(Object.getOwnPropertyNames(o))
// [ 'yes', 'not' ]
console.log(Object.keys(o))
// [ 'yes' ]
for (var x in o)
console.log(x)
// yes, base
また、方法に注意してください:
Object.getOwnPropertyNames
そして、プロトタイプチェーンを上って検索Object.keys
しないでくださいbase
for in
するここでプロトタイプチェーンの詳細:https : //stackoverflow.com/a/23877420/895245
https://j11y.io/demos/prettyprint/
ですか?
これはIE8でもほとんどのブラウザーで機能し、ライブラリーは必要ありません。var iが鍵です。
var myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
var keys=[];
for (var i in myJSONObject ) { keys.push(i); }
alert(keys);
Mozillaには、サポートされていないブラウザでそれを行う方法に関する完全な実装の詳細があります。
if (!Object.keys) {
Object.keys = (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
dontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
],
dontEnumsLength = dontEnums.length;
return function (obj) {
if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
var result = [];
for (var prop in obj) {
if (hasOwnProperty.call(obj, prop)) result.push(prop);
}
if (hasDontEnumBug) {
for (var i=0; i < dontEnumsLength; i++) {
if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
}
}
return result;
};
})();
}
好きなように含めることができますextensions.js
が、スクリプトスタックの最上位にあるファイルに含めることもできます。
IEはネイティブプロパティのfor(i in obj)をサポートしていません。ここに私が見つけたすべての小道具のリストがあります。
Stackoverflowは、いくつかの愚かなフィルタリングを行うようです。
リストは、このgoogleグループの投稿の下部にあります:-https : //groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0
ほとんどすべてのプロジェクトでunderscore.jsを使用しているので、次のkeys
関数を使用します。
var obj = {name: 'gach', hello: 'world'};
console.log(_.keys(obj));
その出力は次のようになります。
['name', 'hello']
解決策は私のケースとクロスブラウザで機能します:
var getKeys = function(obj) {
var type = typeof obj;
var isObjectType = type === 'function' || type === 'object' || !!obj;
// 1
if(isObjectType) {
return Object.keys(obj);
}
// 2
var keys = [];
for(var i in obj) {
if(obj.hasOwnProperty(i)) {
keys.push(i)
}
}
if(keys.length) {
return keys;
}
// 3 - bug for ie9 <
var hasEnumbug = !{toString: null}.propertyIsEnumerable('toString');
if(hasEnumbug) {
var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
var nonEnumIdx = nonEnumerableProps.length;
while (nonEnumIdx--) {
var prop = nonEnumerableProps[nonEnumIdx];
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
keys.push(prop);
}
}
}
return keys;
};
_.keys(myJSONObject)