Bunu istemiyorsanız adım adım yapmanız gerekir, TypeError
çünkü üyelerden biri null
veyaundefined
ise ve bir üyeye erişmeye çalıştığınızda bir istisna atılır.
İstisnayı ya da catch
birden fazla seviyenin varlığını test etmek için aşağıdaki gibi bir işlev yapabilirsiniz:
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 GÜNCELLEME:
ES6 özelliklerini ve özyinelemeyi kullanarak orijinal işlevin daha kısa bir sürümü: (ayrıca uygun kuyruk çağrı formundadır):
function checkNested(obj, level, ...rest) {
if (obj === undefined) return false
if (rest.length == 0 && obj.hasOwnProperty(level)) return true
return checkNested(obj[level], ...rest)
}
Ancak, iç içe bir özelliğin değerini almak ve yalnızca varlığını denetlemek istemiyorsanız, basit bir tek satırlık işlev şunlardır:
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
Yukarıdaki fonksiyon, yuvalanmış özelliklerin değerini almanıza izin verir, aksi takdirde geri döner undefined
.
GÜNCELLEME 2019-10-17:
İsteğe bağlı zincirleme önerisi üzerine Aşama 3 ulaşmış ECMAScript Komitesi süreci , bu izin verecektir size belirteci kullanarak güvenli bir şekilde erişim içe geçmiş özelliklere için ?.
, yeni opsiyonel zincirleme operatörü :
const value = obj?.level1?.level2?.level3
Erişilen düzeylerden herhangi biri null
veya undefined
ifadeundefined
kendi başına çözülürse.
Teklif ayrıca yöntem çağrılarını güvenli bir şekilde yönetmenize olanak tanır:
obj?.level1?.method();
Yukarıda ifade üretecek undefined
halinde obj
, obj.level1
ya da obj.level1.method
vardır null
ya da undefined
aksi takdirde işlevini çağırır.
İsteğe bağlı zincirleme eklentisini kullanarak Babel ile bu özellik ile oynamaya başlayabilirsiniz .
Babel 7.8.0'dan beri , ES2020 varsayılan olarak desteklenmektedir
Kontrol Bu örneği Babel Repl üzerinde.
D GÜNCELLEME: Aralık 2019 🎉🎉
İsteğe bağlı zincirleme teklifi sonunda TC39 komitesinin Aralık 2019 toplantısında Aşama 4'e ulaştı . Bu, bu özelliğin ECMAScript 2020 Standardının bir parçası olacağı anlamına gelir .