Bạn phải làm điều đó từng bước nếu bạn không muốn TypeError
bởi vì nếu một trong số các thành viên là null
hoặc undefined
, và bạn cố gắng truy cập một thành viên, một ngoại lệ sẽ được đưa ra.
Bạn có thể chỉ đơn giản catch
là ngoại lệ hoặc tạo một hàm để kiểm tra sự tồn tại của nhiều cấp độ, đại loại như thế này:
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
CẬP NHẬT ES6:
Đây là phiên bản ngắn hơn của chức năng ban đầu, sử dụng các tính năng và đệ quy ES6 (nó cũng ở dạng gọi đuôi thích hợp ):
function checkNested(obj, level, ...rest) {
if (obj === undefined) return false
if (rest.length == 0 && obj.hasOwnProperty(level)) return true
return checkNested(obj[level], ...rest)
}
Tuy nhiên, nếu bạn muốn lấy giá trị của một thuộc tính lồng nhau và không chỉ kiểm tra sự tồn tại của nó, đây là một hàm đơn giản:
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
Hàm trên cho phép bạn lấy giá trị của các thuộc tính lồng nhau, nếu không sẽ trả về undefined
.
CẬP NHẬT 2019-10-17:
Các đề nghị chaining bắt buộc đạt Giai đoạn 3 trên quá trình ủy ban ECMAScript , điều này sẽ cho phép bạn truy cập một cách an toàn tính lồng nhau sâu sắc, bằng cách sử dụng các dấu hiệu ?.
, mới khai thác chaining tùy chọn :
const value = obj?.level1?.level2?.level3
Nếu bất kỳ mức nào được truy cập là null
hoặc undefined
biểu thức sẽ tự giải quyết undefined
.
Đề xuất cũng cho phép bạn xử lý các cuộc gọi phương thức một cách an toàn:
obj?.level1?.method();
Biểu thức trên sẽ tạo ra undefined
nếu obj
, obj.level1
hoặc obj.level1.method
là null
hay undefined
, nếu không nó sẽ gọi hàm.
Bạn có thể bắt đầu chơi với tính năng này với Babel bằng cách sử dụng plugin chuỗi tùy chọn .
Kể từ Babel 7.8.0 , ES2020 được hỗ trợ theo mặc định
Kiểm tra ví dụ này trên REPL Babel.
UPDATE: Tháng 12 năm 2019
Đề xuất xích tùy chọn cuối cùng đã đạt đến Giai đoạn 4 trong cuộc họp tháng 12 năm 2019 của ủy ban TC39. Điều này có nghĩa là tính năng này sẽ là một phần của Tiêu chuẩn ECMAScript 2020 .