How to list the properties of a JavaScript object?
假设我这样创建一个对象:
1 2 | var myObject = {"ircEvent":"PRIVMSG","method":"newURI","regex":"^http://.*"}; |
检索属性名称列表的最佳方法是什么?也就是说,我希望最终得到一些变量"keys",比如:
1 | keys == ["ircEvent","method","regex"] |
在现代浏览器(IE9+、FF4+、CheleM5+、OrPa12+、SAFARI5+)中,可以使用内置Object.keys方法:
1 | var keys = Object.keys(myObject); |
上面有一个完整的填充物,但是简化的版本是:
1 2 3 4 5 6 7 | var getKeys = function(obj){ var keys = []; for(var key in obj){ keys.push(key); } return keys; } |
另一种方法是用EDCOX1(1)代替EDCOX1(0),以允许在任何对象上调用EDCOX1×2Ω。扩展原型有一些副作用,我不建议这么做。
正如SasHnnk指出的,可以使用"in in"结构来对对象的属性名称进行迭代。不过,您将遍历对象原型链中的所有属性名。如果您只想迭代对象本身的属性,那么可以使用对象的hasownProperty()方法。因此具有以下特点。
1 2 3 4 5 | for (var key in obj) { if (obj.hasOwnProperty(key)) { /* useful code here */ } } |
正如SamDutton所回答的那样,ECMAScript第5版中引入了一种新的方法。
您还可以很容易地在不支持该方法的浏览器中实现该方法。但是,有些实现与Internet Explorer不完全兼容。以下是更兼容的解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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()将为您提供更强大的解决方案。
编辑:在最近与Kangax(一个著名的原型贡献者)的讨论之后,我基于他在这里找到的
请注意,object.keys和其他ecmascript 5方法由firefox 4、chrome6、safari 5、ie9及更高版本支持。
例如:
1 2 | 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/
这个函数也普遍表现出的非可枚举属性的加成,在这些节目中
在JS,每一个房地产有一个确实的性质的,包括一个布尔
在一般情况下,非可枚举属性,更多的是"internalish"和不常常准备使用,但这是insightful来看看他们有时看到什么是真的去了。 </P >
实例: </P >
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
也值得注意的是: </P >
-
Object.getOwnPropertyNames 和Object.keys 不去上的prototype to findbase 链 -
for in 不
更多关于"prototype链:这里的HTTPS stackoverflow.com:/ / / / / 895245 23877420 </P >
我是垃圾处理功能的忠实粉丝。
http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion
可以使用jquery执行以下操作:
1 2 3 | var objectKeys = $.map(object, function(value, key) { return key; }); |
如果您试图只获取元素而不获取函数,那么此代码可以帮助您
1 2 3 4 5 6 7 8 9 10 11 12 | this.getKeys = function() { var keys = new Array(); for(var key in this) { if( typeof this[key] !== 'function') { keys.push(key); } } return keys; } |
这是哈希映射实现的一部分,我只需要键,"this"是包含键的哈希映射对象
这在大多数浏览器中都有效,即使是在IE8中,而且不需要任何类型的库。我是你的钥匙。
1 2 3 4 | var myJSONObject = {"ircEvent":"PRIVMSG","method":"newURI","regex":"^http://.*"}; var keys=[]; for (var i in myJSONObject ) { keys.push(i); } alert(keys); |
在支持JS 1.8的浏览器下:
1 | [i for(i in obj)] |
Mozilla有关于如何在不受支持的浏览器中实现它的完整实现细节,如果这有助于:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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; }; })(); } |
您可以根据自己的喜好将其包含在脚本堆栈顶部的某种
因为我几乎在每个项目中都使用了underline.js,所以我将使用
1 2 | var obj = {name: 'gach', hello: 'world'}; console.log(_.keys(obj)); |
其结果是:
1 | ['name', 'hello'] |
IE不支持本机属性(obj中的i)。这是我能找到的所有道具的清单。
似乎stackoverflow做了一些愚蠢的过滤。
此列表可在本Google Group帖子的底部找到:https://groups.google.com/group/hackvertor/browse ou thread/thread/a9ba81ca642a63e0
基于公认的答案。
如果对象具有要调用的属性,请尝试say.properties()!
1 2 3 4 5 | var keys = Object.keys(myJSONObject); for (var j=0; j < keys.length; j++) { Object[keys[j]].properties(); } |
使用
1 2 | var obj = {a: 1, b: 2, c: 3}; Reflect.ownKeys(obj) // ["a","b","c"] |
object.keys和object.getownpropertynames不能得到的非可枚举属性。它的工作,甚至用非可枚举属性。 </P >
1 2 3 | var obj = {a: 1, b: 2, c: 3}; obj[Symbol()] = 4; Reflect.ownKeys(obj) // ["a","b","c", Symbol()] |
该解决方案的工作是我的案件和跨浏览器: </P >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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; }; |