Anda harus melakukannya langkah demi langkah jika Anda tidak menginginkannya TypeError
karena jika salah satu anggota adalah null
atauundefined
, dan Anda mencoba mengakses anggota, pengecualian akan dilemparkan.
Anda bisa hanya catch
pengecualian, atau membuat fungsi untuk menguji keberadaan beberapa level, seperti ini:
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 PEMBARUAN:
Ini adalah versi yang lebih pendek dari fungsi aslinya, menggunakan fitur ES6 dan rekursi (ini juga dalam bentuk panggilan ekor yang tepat ):
function checkNested(obj, level, ...rest) {
if (obj === undefined) return false
if (rest.length == 0 && obj.hasOwnProperty(level)) return true
return checkNested(obj[level], ...rest)
}
Namun, jika Anda ingin mendapatkan nilai properti bersarang dan tidak hanya memeriksa keberadaannya, berikut ini adalah fungsi satu-baris yang sederhana:
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
Fungsi di atas memungkinkan Anda untuk mendapatkan nilai properti bersarang, jika tidak akan kembali undefined
.
UPDATE 2019-10-17:
The chaining usulan opsional mencapai Tahap 3 pada proses komite ECMAScript , ini akan memungkinkan Anda untuk dengan aman akses properti sangat bersarang, dengan menggunakan token ?.
, yang baru chaining Operator opsional :
const value = obj?.level1?.level2?.level3
Jika salah satu level yang diakses adalah null
atau undefined
ekspresi akan diselesaikanundefined
dengan sendirinya.
Proposal juga memungkinkan Anda untuk menangani panggilan metode dengan aman:
obj?.level1?.method();
Ekspresi di atas akan menghasilkan undefined
jika obj
, obj.level1
atau obj.level1.method
yang null
atauundefined
, jika tidak maka akan memanggil fungsi.
Anda dapat mulai bermain dengan fitur ini dengan Babel menggunakan plugin chaining opsional .
Sejak Babel 7.8.0 , ES2020 didukung secara default
Lihat contoh ini di Babel REPL.
🎉🎉UPDATE: Desember 2019 🎉🎉
Proposal perangkaian opsional akhirnya mencapai Tahap 4 pada pertemuan komite TC39 Desember 2019. Ini berarti fitur ini akan menjadi bagian dari ECMAScript 2020 Standard.