如何列出JavaScript对象的属性?

假设我这样创建一个对象:

var myObject ={"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

检索属性名称列表的最佳方法是什么?即我想以一些变量“键”结束,例如:

keys == ["ircEvent", "method", "regex"]
904622 次浏览

在现代浏览器(IE9+、FF4+、Chrome5+、Opera a12+、Safari5+)中,您可以使用内置的Object.keys方法:

var keys = Object.keys(myObject);

上面的有一个完整的聚填料,但一个简化的版本是:

var getKeys = function(obj){var keys = [];for(var key in obj){keys.push(key);}return keys;}

或者将var getKeys替换为Object.prototype.keys,以允许您在任何对象上调用.keys()。扩展原型有一些副作用,我不建议这样做。

正如对象#拥有自己的属性()08020">slashnick所指出的,你可以使用“for in”构造来迭代对象的属性名称。但是,你将迭代对象原型链中的所有属性名称。如果你想迭代只有对象自己的属性,你可以使用对象#拥有自己的属性()方法。因此有以下内容。

for (var key in obj) {if (obj.hasOwnProperty(key)) {/* useful code here */}}

IE不支持原生属性的(i in obj)。这是我能找到的所有道具的列表。

看起来stackoverflow做了一些愚蠢的过滤。

该列表可在此Google群组帖子的底部找到:-https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0

请注意,Firefox 4、Chrome6、Safari5、IE 9及更高版本支持Object.keys和其他ECMAScript 5方法。

例如:

var o = {"foo": 1, "bar": 2};alert(Object.keys(o));

ECMAScript 5兼容性表

新方法的描述

正如Sam Dutton回答的那样,在ECMAScript第5版中引入了一个为此目的的新方法。Object.keys()将做你想做的事情,并在火狐4、Chrome6、Safari5和ie9中得到支持。

您还可以在不支持它的浏览器中非常轻松地实现该方法。但是,那里的一些实现与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中著名的DontEnumbug,其中原型链上的不可枚举属性导致本地声明的同名属性继承其DontEnum属性。

实现Object.keys()将为您提供更强大的解决方案。

编辑:在最近与kangax(一个著名的原型贡献者)的讨论之后,我实现了DontEnumbug的解决方法,基于他的Object.forIn()函数的代码,找到了这里

如果您尝试只获取元素而不是函数,那么此代码可以帮助您

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 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)]

可以用jQuery做到这一点,如下所示:

var objectKeys = $.map(object, function(value, key) {return key;});

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文件中。

以接受的答案为基础。

如果对象有你想调用的属性,比如. Properties()try!

var keys = Object.keys(myJSONObject);
for (var j=0; j < keys.length; j++) {Object[keys[j]].properties();}

因为我几乎在每个项目中都使用underscore.js,所以我会使用keys函数:

var obj = {name: 'gach', hello: 'world'};console.log(_.keys(obj));

其产出将是:

['name', 'hello']

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.getOwnPropertyNamesObject.keys不要沿着原型链向上找到base
  • for in没有

更多关于原型链的信息:https://stackoverflow.com/a/23877420/895245

该解决方案适用于我的案例和跨浏览器:

var getKeys = function(obj) {var type = typeof  obj;var isObjectType = type === 'function' || type === 'object' || !!obj;
// 1if(isObjectType) {return Object.keys(obj);}
// 2var 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;};

使用Reflect.ownKeys()

var obj = {a: 1, b: 2, c: 3};Reflect.ownKeys(obj) // ["a", "b", "c"]

Object.keysObject.get所有权不能获得不可枚举属性。它甚至对不可枚举属性也有效。

var obj = {a: 1, b: 2, c: 3};obj[Symbol()] = 4;Reflect.ownKeys(obj) // ["a", "b", "c", Symbol()]

使用ES6及更高版本(ECMAScript 2015),您可以获得如下所有属性:

let keys = Object.keys(myObject);

如果你想列出所有的值:

let values = Object.keys(myObject).map(key => myObject[key]);

这里有很多答案…这是我的2美分。

我需要一些东西来打印出所有JSON属性,即使是带有子对象或数组(包括父名称)的属性。

所以-对于这个JSON:

mylittleJson = {"one": "blah","two": {"twoone": "","twotwo": "","twothree": ['blah', 'blah']},"three": ""}

它会打印这个:

.one.two.twoone.two.twotwo.two.twothree.three

这是功能

function listatts(parent, currentJson){var attList = []if (typeof currentJson !== 'object' || currentJson == undefined || currentJson.length > 0) {return}for(var attributename in currentJson){if (Object.prototype.hasOwnProperty.call(currentJson, attributename)) {childAtts = listatts(parent + "." + attributename, currentJson[attributename])if (childAtts != undefined && childAtts.length > 0)attList = [...attList, ...childAtts]elseattList.push(parent + "." + attributename)}}return attList}
mylittleJson = {"one": "blah","two": {"twoone": "","twotwo": "","twothree": ['blah', 'blah']},"three": ""}
console.log(listatts("", mylittleJson));

希望它也有帮助。