Як відповів Сем Даттон, новий метод саме для цієї мети був введений у 5-е видання ECMAScript. 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 () дасть вам більш надійне рішення.
EDIT: після нещодавньої дискусії з кенгу , відомим учасником прототипу, я реалізував рішення для помилки DontEnum на основі коду для його Object.forIn()
функції, знайденої тут .
_.keys(myJSONObject)