คุณต้องทำทีละขั้นถ้าคุณไม่ต้องการTypeError
เพราะถ้าหนึ่งในสมาชิกคือnull
หรือundefined
และคุณพยายามเข้าถึงสมาชิกข้อยกเว้นจะถูกโยน
คุณสามารถcatch
ยกเว้นได้อย่างง่ายดายหรือสร้างฟังก์ชั่นเพื่อทดสอบการมีอยู่ของหลาย ๆ ระดับดังนี้:
function checkNested(obj /*, level1, level2, ... levelN*/) {
var args = Array.prototype.slice.call(arguments, 1);
for (var i = 0; i < args.length; i++) {
if (!obj || !obj.hasOwnProperty(args[i])) {
return false;
}
obj = obj[args[i]];
}
return true;
}
var test = {level1:{level2:{level3:'level3'}} };
checkNested(test, 'level1', 'level2', 'level3'); // true
checkNested(test, 'level1', 'level2', 'foo'); // false
อัพเดท ES6:
นี่คือฟังก์ชั่นดั้งเดิมที่สั้นกว่าโดยใช้คุณสมบัติ ES6 และการเรียกซ้ำ (ยังอยู่ในรูปแบบการเรียกหางที่เหมาะสม ):
function checkNested(obj, level, ...rest) {
if (obj === undefined) return false
if (rest.length == 0 && obj.hasOwnProperty(level)) return true
return checkNested(obj[level], ...rest)
}
อย่างไรก็ตามหากคุณต้องการรับค่าของคุณสมบัติซ้อนกันและไม่เพียง แต่ตรวจสอบการมีอยู่ของมันนี่คือฟังก์ชั่นหนึ่งบรรทัดง่ายๆ:
function getNested(obj, ...args) {
return args.reduce((obj, level) => obj && obj[level], obj)
}
const test = { level1:{ level2:{ level3:'level3'} } };
console.log(getNested(test, 'level1', 'level2', 'level3')); // 'level3'
console.log(getNested(test, 'level1', 'level2', 'level3', 'length')); // 6
console.log(getNested(test, 'level1', 'level2', 'foo')); // undefined
console.log(getNested(test, 'a', 'b')); // undefined
ฟังก์ชั่นด้านบนอนุญาตให้คุณรับค่าคุณสมบัติซ้อนกันมิฉะนั้นจะส่งคืน undefined
ฟังก์ชั่นดังกล่าวข้างต้นจะช่วยให้คุณได้รับค่าของคุณสมบัติที่ซ้อนกันมิฉะนั้นจะกลับมา
อัพเดท 2019-10-17:
ข้อเสนอการผูกมัดตัวเลือกถึง 3 ขั้นตอนในกระบวนการของคณะกรรมการ ECMAScriptนี้จะช่วยให้คุณได้อย่างปลอดภัยการเข้าถึงคุณสมบัติที่ซ้อนกันอย่างลึกซึ้งโดยใช้โทเค็น?.
ใหม่ผู้ประกอบการผูกมัดตัวเลือก :
const value = obj?.level1?.level2?.level3
หากระดับการเข้าถึงใด ๆ เป็นnull
หรือundefined
การแสดงออกจะแก้ไขundefined
ด้วยตัวเอง
ข้อเสนอนี้ยังช่วยให้คุณสามารถจัดการวิธีการโทรได้อย่างปลอดภัย:
obj?.level1?.method();
การแสดงออกดังกล่าวข้างต้นจะผลิตundefined
ถ้าobj
, obj.level1
หรือobj.level1.method
มีnull
หรือundefined
มิฉะนั้นจะเรียกใช้ฟังก์ชัน
คุณสามารถเริ่มเล่นด้วยคุณสมบัตินี้กับ Babel โดยใช้ปลั๊กอินเสริมที่ผูกมัดตัวเลือกการผูกมัดปลั๊กอิน
ตั้งแต่Babel 7.8.0 , ES2020 ได้รับการสนับสนุนโดยค่าเริ่มต้น
ตรวจสอบตัวอย่างนี้ใน Babel REPL
🎉🎉UPDATE: ธันวาคม 2562 🎉🎉
ในที่สุดข้อเสนอที่เป็นตัวเลือกถึงขั้นตอนที่ 4ในการประชุมธันวาคม 2558 ของคณะกรรมการ TC39 นี่หมายความว่าฟีเจอร์นี้จะเป็นส่วนหนึ่งของมาตรฐานECMAScript 2020