Answers:
在现代浏览器(IE9 +,FF4 +,Chrome5 +,Opera12 +,Safari5 +)中,您可以使用内置的Object.keys方法:
var keys = Object.keys(myObject);
上面有完整的polyfill,但简化的版本是:
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指出的那样,您可以使用“ for in”构造来遍历对象的属性名称。但是,您将遍历对象原型链中的所有属性名称。如果你想迭代只是在对象自己的属性,你可以利用的对象#hasOwnProperty()方法。因此具有以下。
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
/* useful code here */
}
}
esc
键,因为该对象具有大约一百万个属性,其中大多数未使用,并且对此我发出了警报。
正如Sam Dutton回答的那样,ECMAScript 5th Edition中引入了用于此目的的新方法。 Object.keys()
可以满足您的要求,并在Firefox 4,Chrome 6,Safari 5和IE 9中受支持。
您也可以在不支持该方法的浏览器中轻松实现该方法。但是,其中的某些实现与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
。不过,通常情况下,较短的代码看上去比较大,更健壮的代码更具吸引力,但是,答案的关键是使用ECMAScript 5th Object.keys()
,它可以在不支持使用此代码的浏览器中实现。本机版本将比这具有更高的性能。
Object.keys
仅返回与对象的可枚举属性相对应的字符串数组。在使用本机(用户定义的)对象时,这可能不是至关重要的,但对于宿主对象应该非常明显(尽管未指定的宿主对象的行为是一个单独的痛苦的故事)。要列举对所有(包括不可枚举)特性,ES5提供Object.getOwnPropertyNames
(见它在我的COMPAT表支持- kangax.github.com/es5-compat-table)
Object.keys(stuff)
,而不是stuff.keys()
?
请注意,Firefox 4,Chrome 6,Safari 5,IE 9和更高版本支持Object.keys和其他ECMAScript 5方法。
例如:
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中,每个属性都有一些属性,包括boolean 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 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在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)