如何列出JavaScript对象的属性
假设我创build一个对象:
var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
检索属性名称列表的最佳方法是什么? 即我想结束一些variables“键”,使得:
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; }
或者用Object.prototype.keys
replacevar getKeys
以允许您在任何对象上调用.keys()
。 扩展原型有一些副作用,我不会推荐这样做。
正如Slashnick所指出的,你可以使用“for in”构造来迭代对象的属性名称。 但是,您将迭代对象的原型链中的所有属性名称。 如果只想遍历对象自己的属性,可以使用Object#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()的检查,并将返回通过原型链inheritance的属性。 它也没有考虑到Internet Explorer中着名的DontEnum错误,其中原型链上的非枚举属性导致具有相同名称的本地声明属性inheritance它们的DontEnum属性。
实现Object.keys()将为您提供更强大的解决scheme。
编辑:遵循最近与kangax ,Prototype的知名贡献者的讨论,我实现了基于他的Object.forIn()
函数的代码在这里find的DontEnum错误的解决方法。
请注意,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/
我是转储function的巨大粉丝。
http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion
可以用jQuery来完成,如下所示:
var objectKeys = $.map(object, function(value, key) { return key; });
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
如果你想获得元素而不是函数,那么这段代码可以帮助你
this.getKeys = function() { var keys = new Array(); for(var key in this) { if( typeof this[key] !== 'function') { keys.push(key); } } return keys; }
这是我的HashMap实现的一部分,我只想要的键,“这个”是包含键的哈希映射对象
这在大多数浏览器中都可以使用,即使是在IE8中,也不需要任何types的库。 我是你的钥匙。
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
文件中。
IE不支持(我在OBJ)本地属性。 这是我能find的所有道具的清单。
看来stackoverflow做了一些愚蠢的过滤。
该列表可在此Google小组post的底部find: 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']
build立在被接受的答案上。
如果对象有你想调用的属性说.properties()试试!
var keys = Object.keys(myJSONObject); for (j=0; j < keys.length; j++) { Object[keys[i]].properties(); }
解决scheme适用于我的案例和跨浏览器:
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; };
您可以使用对象值可重用组件来获取所有对象的值。
例:
values({ a: 1, b: 2, c: 3 }) // => [1, 2, 3]
怎么运行的:
function values(object: {[any]: any}): any[] { const objValues = []; forEach(object, val => objValues.push(val)); return objValues; };