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

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

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

keys == ["ircEvent", "method", "regex"]

当前回答

正如slashnick指出的,您可以使用“for in”构造来遍历对象的属性名。但是,您将遍历对象原型链中的所有属性名。如果你只想遍历对象自己的属性,你可以使用object #hasOwnProperty()方法。因此有以下。

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

其他回答

正如slashnick指出的,您可以使用“for in”构造来遍历对象的属性名。但是,您将遍历对象原型链中的所有属性名。如果你只想遍历对象自己的属性,你可以使用object #hasOwnProperty()方法。因此有以下。

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

如果你只是想获取元素,而不是函数,那么这段代码可以帮助你

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对象

这里有很多答案…这是我的意见。

我需要一些东西来打印出所有的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] else attList.push(parent + "." + attributename) } } return attList } mylittleJson = { "one": "blah", "two": { "twoone": "", "twotwo": "", "twothree": ['blah', 'blah'] }, "three": "" } console.log(listatts("", mylittleJson));

希望这也能有所帮助。

在现代浏览器(IE9+, FF4+, Chrome5+, Opera12+, Safari5+)中,您可以使用内置的Object。键的方法:

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()。扩展原型有一些副作用,我不建议这么做。

正如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错误的解决方案。