Dynamic deep selection for a JavaScript object -


एक एकल संपत्ति के साथ यह काफी आसान है:

  var jsonobj = {"test" : "ठीक"} var propname = "test"; // चेतावनी "ठीक है" चेतावनी (jsonobj [propname]);  

लेकिन मुझे क्या करना है नेस्टेड प्रॉपर्टी का उपयोग करना है:

  var jsonobj = {"test": {"test2": "ठीक है"} } Var propname = "test.test2"; // चेतावनी अपरिभाषित चेतावनी (jsonobj [propname]);  

क्या नेस्टेड "गतिशील" संपत्ति का चयन करने का कोई तरीका है? मुझे पता है कि मैं jsonobj.test.test2 कर सकता हूं, लेकिन समस्या यह है कि प्रोपेनाम एक संपत्ति में बदल सकता है जो 1,2 या 3 स्तरों को गहरा कर देता है (उदाहरण, परीक्षण, test.test2, ...)

<पूर्व> फ़ंक्शन समाधान (cur, ns ) {Var undef; Ns = ns.split ('।'); जबकि (क्यू & amp; एनएस [0]) कर = क्र [एनएसशफ्ट ()] || undef; वापसी कर; }

उदाहरण के लिए

  // 1: हल ({foo: {बार: 123}}, 'foo.bar'); // = & gt; 123/2: var जटिल = {a: {b: [document.createElement ('div')]}}; संकल्प (जटिल, 'a.b.0.nodeName'); // = & gt; डीआईवी  

इस का उपयोग करने में लाभ यह है कि यदि आप ऐसी चीज़ों तक पहुंचने का प्रयास करते हैं जो यह मौजूद नहीं है, तो यह कोई त्रुटि नहीं डालेगा - यह शानदार ढंग से अपरिभाषित


संपादित करें:

टिप्पणी में, एंडी ने उल्लेख किया कि यह त्रुटियों को नहीं फेंकता है, जहां कोई इसकी उम्मीद कर सकता है। मैं मानता हूं कि अपरिभाषित प्राप्त करना थोड़ा सामान्य है और यह बताने का कोई तरीका नहीं है कि आपका मान वास्तव में हल हो गया है या नहीं। तो, उपाय करने के लिए, यह कोशिश करें:

  var resol = = (function () {var UNRESOLVED = resolve.UNRESOLVED = {}; रिटर्न समाधान; फ़ंक्शन समाधान (cur, ns) {var undef ; Ns = ns.split ('।'); जबकि (और amp; amp; एनएस [0]) cur = cur [ns.shift ()] || undef; if (cur === undef || ns [0] ]) {वापसी UNRESOLVED;} वापसी वापसी;}} ());  

यह एक अनारोलवोड ऑब्जेक्ट वापस लौटाएगा जिसे इस तरह से चेक किया जा सकता है:

  var परिणाम = निराकरण (कुछ ऑब्जेक्ट, 'a.b.c'); यदि (परिणाम === संकल्प। अनारोलवड) {...}  

यह सही नहीं है, लेकिन यह (आईएमओ) त्रुटियों को फेंकने के बिना एक अनसुलझे नामस्थान निर्धारित करने का सर्वोत्तम तरीका है यदि आप त्रुटियाँ चाहते हैं, तो बस इसके साथ आगे बढ़ें:

  someObject.a.b.c; // ...  

Comments

Popular posts from this blog

c# - sqlDecimal to decimal clr stored procedure Unable to cast object of type 'System.Data.SqlTypes.SqlDecimal' to type 'System.IConvertible' -

Calling GetGUIThreadInfo from Outlook VBA -

Obfuscating Python code? -