如何列出JavaScript对象的属性?

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版中引入了一种新的方法。Object.keys()可以满足您的需求,并在Firefox 4、Chrome 6、Safari 5和IE 9中得到支持。

您还可以很容易地在不支持该方法的浏览器中实现该方法。但是,有些实现与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.forIn()函数的代码实现了Dontenum bug的解决方案。


请注意,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/


Object.getOwnPropertyNames(obj) </P >

这个函数也普遍表现出的非可枚举属性的加成,在这些节目中Object.keys(obj)。。。。。。。 </P >

在JS,每一个房地产有一个确实的性质的,包括一个布尔enumerable。。。。。。。 </P >

在一般情况下,非可枚举属性,更多的是"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.getOwnPropertyNamesObject.keys不去上的prototype to find base
  • for in

更多关于"prototype链:这里的HTTPS stackoverflow.com:/ / / / / 895245 23877420 </P >


我是垃圾处理功能的忠实粉丝。

http://ajaxian.com/archives/javascript-variable-dump-in-coldfusionalt text


可以使用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;
    };
  })();
}

您可以根据自己的喜好将其包含在脚本堆栈顶部的某种extensions.js文件中。


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

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();
}

使用Reflect.ownKeys() </P >

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;
};