Wie Sam Dutton antwortete, wurde in ECMAScript 5th Edition eine neue Methode für diesen Zweck eingeführt. Object.keys()macht, was Sie wollen und wird in Firefox 4 , Chrome 6, Safari 5 und IE 9 unterstützt .
Sie können die Methode auch sehr einfach in Browsern implementieren, die sie nicht unterstützen. Einige der Implementierungen sind jedoch nicht vollständig mit Internet Explorer kompatibel. Hier ist eine kompatiblere Lösung:
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;
};
})();
Beachten Sie, dass die aktuell akzeptierte Antwort keine Prüfung auf hasOwnProperty () enthält und Eigenschaften zurückgibt , die über die Prototypenkette vererbt werden. Der berühmte DontEnum-Fehler in Internet Explorer, bei dem nicht aufzählbare Eigenschaften in der Prototypenkette dazu führen, dass lokal deklarierte Eigenschaften mit demselben Namen ihr DontEnum-Attribut erben, wird ebenfalls nicht berücksichtigt.
Durch die Implementierung von Object.keys () erhalten Sie eine robustere Lösung.
BEARBEITEN: Nach einer kürzlichen Diskussion mit kangax , einem bekannten Mitwirkenden an Prototype, habe ich die Problemumgehung für den DontEnum-Fehler basierend auf dem Code für seine hierObject.forIn() gefundene Funktion implementiert .
_.keys(myJSONObject)