假设我这样创建了一个对象:
var myObject =
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
如何最好地检索属性名称列表?也就是说,我想最终得到一些变量'keys',使其具有以下特点:
keys == ["ircEvent", "method", "regex"]
假设我这样创建了一个对象:
var myObject =
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
如何最好地检索属性名称列表?也就是说,我想最终得到一些变量'keys',使其具有以下特点:
keys == ["ircEvent", "method", "regex"]
在现代浏览器(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
方法不可用。 - awhie29urh2Object.keys
方法仅返回对象自身的属性。我认为这是一个重要的区别。 - Martin Carel正如slashnick所指出的,你可以使用"for in"结构来迭代对象的属性名。但是,你将遍历对象原型链中所有的属性名。如果你只想迭代对象自己的属性,你可以使用Object#hasOwnProperty()方法。因此,可以得到以下内容。
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
/* useful code here */
}
}
Object.keys()
可以实现你想要的功能,并且支持Firefox 4,Chrome 6,Safari 5和IE 9。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;
};
})();
Object.forIn()
函数的代码实现了DontEnum bug的解决方法,该代码可以在here找到。Object.prototype
的扩展。虽然通常情况下,较短的代码看起来比更大、更健壮的代码更具吸引力,但这个答案的重点是使用ECMAScript 5th的Object.keys()
,可以在不支持它的浏览器中使用此代码实现。本机版本甚至比这个更高效。 - Andy EObject.keys
只返回一个数组,其中包含一个对象的可枚举属性所对应的字符串。当使用本机(用户定义)对象时,这可能并不重要,但当使用宿主对象时,这就应该非常明显了(尽管未指定的主机对象行为是一个独立而痛苦的故事)。为了枚举所有(包括不可枚举)属性,ES5 提供了 Object.getOwnPropertyNames
(请参见我的 compat. 表中的支持- http://kangax.github.com/es5-compat-table/)。 - kangaxObject.keys(stuff)
而不是 stuff.keys()
吗? - Blazemonger请注意,Object.keys和其他ECMAScript 5方法受到Firefox 4、Chrome 6、Safari 5、IE 9及以上版本的支持。
例如:
var o = {"foo": 1, "bar": 2};
alert(Object.keys(o));
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://dev59.com/a3RB5IYBdhLWcg3wn4UL#23877420
https://j11y.io/demos/prettyprint/
_ - Kiquenet可以使用jQuery完成如下操作:
var objectKeys = $.map(object, function(value, key) {
return key;
});
如果你只想获取元素而不是函数,那么这段代码可以帮助你。
this.getKeys = function() {
var keys = new Array();
for(var key in this) {
if( typeof this[key] !== 'function') {
keys.push(key);
}
}
return keys;
}
这是我实现HashMap的一部分,我只想要键(key),“this”是包含这些键的HashMap对象。
这将在大多数浏览器中工作,甚至在IE8中也可以,不需要任何库。变量i是你的键。
var myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
var keys=[];
for (var i in myJSONObject ) { keys.push(i); }
alert(keys);
使用 Reflect.ownKeys()
var obj = {a: 1, b: 2, c: 3};
Reflect.ownKeys(obj) // ["a", "b", "c"]
Object.keys和Object.getOwnPropertyNames不能获取不可枚举属性。即使对于不可枚举的属性,它也可以正常工作。
var obj = {a: 1, b: 2, c: 3};
obj[Symbol()] = 4;
Reflect.ownKeys(obj) // ["a", "b", "c", Symbol()]
_.keys(myJSONObject)
- Endy TjahjonoObject.keys(obj)
。但有时您也需要获取不可枚举的属性。如果需要获取这些属性,请记住使用Object.getOwnPropertyNames(obj)
。参考来源:https://dev59.com/9nVC5IYBdhLWcg3wsTfv#32413145 - Andrew