ดังที่ Sam Dutton ตอบวิธีการใหม่สำหรับจุดประสงค์นี้ได้ถูกนำเสนอใน ECMAScript 5th Edition Object.keys()
จะทำในสิ่งที่คุณต้องการและได้รับการสนับสนุนในFirefox 4 , 6 Chrome, 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 , ผู้บริจาคที่รู้จักกันดีต้นแบบผมดำเนินการแก้ปัญหาสำหรับข้อผิดพลาด DontEnum ตามรหัสของเขาObject.forIn()
ฟังก์ชั่นที่พบที่นี่
_.keys(myJSONObject)