2011-01-13 11 views
24

क्या किसी सदस्य के अस्तित्व की जांच करने के लिए किसी ऑब्जेक्ट के प्रत्येक स्तर के अस्तित्व की जांच करने के लिए ___ in object का उपयोग करने का कोई आसान तरीका है?जांचें कि ऑब्जेक्ट सदस्य नेस्टेड ऑब्जेक्ट में मौजूद है

अधिक संक्षेप में: मैं कैसे जांच सकता हूं कि someObject.member.member.member.value मौजूद है?

उत्तर

32

सामान्य रूप से, आप if(property in object) का उपयोग कर सकते हैं, लेकिन यह अभी भी नेस्टेड सदस्यों के लिए बोझिल होगा।

आप एक समारोह लिख सकते हैं:

function test(obj, prop) { 
    var parts = prop.split('.'); 
    for(var i = 0, l = parts.length; i < l; i++) { 
     var part = parts[i]; 
     if(obj !== null && typeof obj === "object" && part in obj) { 
      obj = obj[part]; 
     } 
     else { 
      return false; 
     } 
    } 
    return true; 
} 

test(someObject, 'member.member.member.value'); 

DEMO

+0

अच्छा लग रहा है। मुझे लूपिंग दृष्टिकोण पसंद है, लेकिन __typeof obj === "ऑब्जेक्ट" __ वास्तव में कैसे मदद करता है? क्या यह सच नहीं है कि टाइपफ ऑब्जेक्ट को शून्य और सरणी के लिए भी वापस कर सकता है? – JustcallmeDrago

+0

@ जस्टकल्मेड्रागो: ट्रू ... हालांकि सरणी के लिए इतना मायने रखता नहीं है, लेकिन यह 'शून्य' के लिए असफल होगा। तो यह भी शून्य के लिए एक चेक जोड़ने के लिए बेहतर हो सकता है। मैंने परीक्षण जोड़ा क्योंकि 'में' मान 'एक त्रुटि फेंक देगा। जोड़ा गया 'शून्य' परीक्षण। –

+0

@ फ़ेलिक्स: मैं देखता हूं। मुझे वास्तव में एक तर्क के रूप में स्ट्रिंग पसंद है, लेकिन पैट्रिक के जवाब की सादगी भी है। क्या वह तुम्हारा जितना सुरक्षित है? क्या यह तेज़ है? – JustcallmeDrago

2

कुछ (चेतावनी: अपरीक्षित कोड आगे) की तरह

var testProperty = function(obj, proplist) { 
    for (var i=0; i < proplist.length; i++) { 
     if (obj.hasOwnProperty(proplist[i])) { 
     obj = obj[proplist[i]]; 
     } else { 
     return false; 
     } 
    } 
    return true; 
} 
+0

'proplist.length' होना चाहिए। –

+0

@ फ़ेलिक्स - धन्यवाद, निश्चित।इसके अलावा, फॉर्ज़ का जवाब हैऑनप्रोपर्टी – Malvolio

+0

के विकल्प के लिए मेरे उत्तर पर टिप्पणी देखें, अगर ओबज 'शून्य 'है तो आपका असफल भी होगा। –

2
if (someObject.member && someObject.member.member && 
    someObject.member.member.member && someObject.member.member.member.value) ... 

या इसी तरह:

var val = foo.bar && foo.bar.jim && foo.bar.jim.jam && foo.bar.jim.jam.value; 

यह नहीं होगा 'काम' यदि कोई विशेष मूल्य null, false होता है, 0, या "" (एक खाली स्ट्रिंग), लेकिन अंतिम मूल्य के संभावित अपवाद के साथ, यह मामला होने की संभावना नहीं है।

यह भी ध्यान दें कि typeof ____ !== "undefined" यह देखने के लिए सही परीक्षण नहीं है कि किसी ऑब्जेक्ट की संपत्ति है या नहीं। इसके बजाय आपको ___ in object का उपयोग करना चाहिए, उदा। if ("member" in someObject)। ऐसा इसलिए है क्योंकि आप undefined के स्पष्ट मान पर एक प्रॉपर्टी सेट कर सकते हैं, जो delete someObject.member के साथ इसे हटाने से अलग है।

4

यहाँ एक ही रास्ता: http://jsfiddle.net/9McHq/

var result = ((((someObject || {}).member || {}).member || {}).member || {}).value; 

alert(result); 
+0

अच्छा। निश्चित रूप से इसे आसानी से एक रिकर्सिव फ़ंक्शन में बदल दिया जा सकता है! – JustcallmeDrago

5

आप भी आजमा सकते/कैच लेखन त्रुटि? स्वरूपण/स्ट्रिंग प्रक्षेप के लिए उपयोगी -

try { 
    console.log(someObject.member.member.member.value); 
} catch(e) { 
    if (e instanceof TypeError) { 
    console.log("Couldn't access someObject.member.member.member.value"); 
    console.log(someObject); 
    } 
} 
2

एक safeRead समारोह परिभाषित here on thecodeabode जो एक safeRead नेस्टेड गुण की यानी

safeRead(foo, 'bar', 'jim', 'jam'); 

की अनुमति देता है, तो गुण के किसी भी रिक्त हैं या अपरिभाषित एक खाली स्ट्रिंग दिया जाता है Theres

+0

मुझे वास्तव में यह समाधान पसंद है – Sukima

+0

वह कोड खराब लिखा गया है और काम नहीं करता है। – Coldstar

0

आप lodash पुस्तकालय का उपयोग कर सकते हैं, तो यह एक बहुत ही सुंदर समाधान है, hasIn

_.hasIn(someObject, 'member.level1.level2.level3'); 
उदाहरण के लिए

,

var obj = {'x': 999, 'a': {'b': {'c': 123, 'd': 234}}} 
// => undefined 

_.hasIn(obj, 'x') 
// => true 

_.hasIn(obj, 'a.b.d') 
// => true 

_.hasIn(obj, 'a.b.e') 
// => false 
संबंधित मुद्दे