假设我创建了一个对象:
var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
检索属性名称列表的最佳方法是什么?即我想最终得到一些变量'键',这样:
keys == ["ircEvent", "method", "regex"]
slashnick.. 1026
在现代浏览器(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()
任何对象.扩展原型有一些副作用,我不建议这样做.
在现代浏览器(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()
任何对象.扩展原型有一些副作用,我不建议这样做.
正如slashnick指出的那样,您可以使用"for in"构造来迭代对象的属性名称.但是,您将迭代对象原型链中的所有属性名称.如果你想迭代只是在对象自己的属性,你可以利用的对象#hasOwnProperty()方法.因此具有以下内容.
for (var key in obj) { if (obj.hasOwnProperty(key)) { /* useful code here */ } }
正如Sam Dutton回答的那样,ECMAScript第5版中引入了一种用于此目的的新方法. 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 bug的变通方法.
请注意,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中,每个属性都有一些属性,包括布尔值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
我是转储功能的忠实粉丝.
http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion
可以用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的一部分,我只想要键,"this"是包含键的hashmap对象
这适用于大多数浏览器,即使在IE8中也是如此,并且不需要任何类型的库.var i是你的关键.
var myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}; var keys=[]; for (var i in myJSONObject ) { keys.push(i); } alert(keys);
在支持js 1.8的浏览器下:
[i for(i in obj)]
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
包含在脚本堆栈顶部的某种文件中.