यदि आपको ऐसा नहीं करना है, तो आपको इसे चरण दर चरण करना होगा 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
, अन्यथा यह समारोह कॉल करेंगे।
आप वैकल्पिक चैनिंग प्लगइन का उपयोग करके बैबिल के साथ इस सुविधा के साथ खेलना शुरू कर सकते हैं ।
चूंकि बाबेल 7.8.0, ES2020 डिफ़ॉल्ट रूप से समर्थित है
इस उदाहरण को Babel REPL पर जाँचें ।
Dअपडेट: दिसंबर २०१ ९:
वैकल्पिक चाइनिंग प्रस्ताव आखिरकार TC39 समिति की दिसंबर 2019 की बैठक में स्टेज 4 तक पहुंच गया । इसका मतलब है कि यह सुविधा ECMAScript 2020 स्टैंडर्ड का हिस्सा होगी ।