Как ответил Сэм Даттон, новый метод для этой цели был введен в 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 () и возвращает свойства, которые наследуются через цепочку прототипов. Он также не учитывает известную ошибку DontEnum в Internet Explorer, когда неперечислимые свойства в цепочке прототипов приводят к тому, что локально объявленные свойства с тем же именем наследуют свой атрибут DontEnum.
Реализация Object.keys () даст вам более надежное решение.
РЕДАКТИРОВАТЬ: после недавнего обсуждения с kangax , известным автором Prototype, я реализовал обходной путь для ошибки DontEnum на основе кода для его Object.forIn()
функции, найденного здесь .
_.keys(myJSONObject)