javascript - Get property value from deep object -
मेरा लक्ष्य: बहु-स्तरीय जावास्क्रिप्ट ऑब्जेक्ट से प्रॉपर्टी का मान प्राप्त करने का एक तरीका बनाएं।
उदाहरण के लिए, यहां एक ऑब्जेक्ट है जिसे मैं से संपत्ति का मूल्य प्राप्त करना चाहता हूं:
var मूल कुकी ऑब्जेक्ट = {उपयोगकर्ता: "notmyemail@gmail.com", ग्रिडस्टेट्स: {gridName: {"पेज "," पेजसिझ ": 50," सॉर्ट ": [{फ़ील्ड:" आमनाम ", डीआईआर:" डार "}]}}, प्रोटेक्शन स्टेट: {सिलेक्टरॉ:" स्ट्रिंग ", पैनल्स ओपन: ['स्ट्रिंग', 'स्ट्रिंग ']}} और यहां बताया गया है कि मैं संपत्ति के मूल्य को कैसे प्राप्त कर सकता हूं:
getProperty (मूलकुकीऑब्जेक्ट,' ग्रिडनाम '); मैंने अभी तक निम्नलिखित रिकर्सिव फ़ंक्शन की कोशिश की है:
फ़ंक्शन ट्रैवर्स (toTraverse, findKey) {यदि (टाइपफ टूट्रावर्स == "ऑब्जेक्ट") {Var foundValue = toTraverse [खोजकी]; अगर (foundValue) {रिटर्न मिला Value; } $ .each (toTraverse, फ़ंक्शन (कश्मीर, वी) {// k या तो एक सरणी अनुक्रमणिका या ऑब्जेक्ट कुंजी ट्रॉर्ज़ (v, findKey);}); }} Var objectValue = traverse (मूलकुकीऑब्जेक्ट, 'ग्रिडनाम'); console.log (objectValue); मेरी समस्या तब होती है जब मैं एक से अधिक स्तर की गहराई से जाने की कोशिश करता / करती हूं, वर्तमान traverse () कॉल केवल माता-पिता के लिए संपत्ति का मान देता है traverse () कॉल। मेरे प्रश्न:
- मैं कैसे एक बच्चा
traverse () कॉल कर सकता हूँ - क्या यह करने का एक बेहतर तरीका है? पोस्टर "itemprop =" text ">
मैं कैसे एक बच्चे के पार () कॉल कर सकते हैं संपत्ति मान मूल अभिभावकों () फ़ंक्शन को लौटाते हैं?
द्वारा
ऐसा करने का कोई बेहतर तरीका है?
आप निश्चित रूप से संरचना को फिर से घुमाने के लिए के लिए ... में इसे थोड़ा आसान बना देता है क्योंकि आप सीधे लूप बॉडी से लौट सकते हैं और किसी इंटरमीडिएट वेरिएबल का उपयोग नहीं कर सकते हैं। हालांकि, आपके कार्यान्वयन के साथ दो समस्याएं हैं:
- यदि खोजी गई कुंजी में नकली मूल्य है (
if (foundValue) के कारण {...} < / कोड>); - आप मान मिल जाने के बाद भी देख रहे हैं (ठीक है, आपके मामले में आपको यह पता भी नहीं है कि आपको मूल्य कब मिलेगा, लेकिन अन्य जवाबों में वह समस्या है)।
- यदि डेटा संरचना में एक ही नाम के साथ एकाधिक चाबियाँ हैं, तो आप केवल पहले एक प्राप्त कर रहे हैं। चाहे यह एक मुद्दा है या नहीं, उस डेटा पर निर्भर करता है जिसे आप काम कर रहे हैं।
निम्न समाधान 1. और 2 का ध्यान रखता है।
फ़ंक्शन ट्रॉवर्स (टूट्रॉवर्स, ढूंढेंकी) {यदि (टाइपओफ टू टूवरवर्स == "ऑब्जेक्ट") (यदि (toTraverse.hasOwnPropert (findKey)) {// वस्तु इस संपत्ति है? वापसी [खोजकी]; } Var foundValue; $ .each (toTraverse, function (k, v) {var value = traverse (v, findkey); यदि (प्रकार का मूल्य! == 'अपरिभाषित') {foundValue = value; return false; // stop looking}}); रिटर्न मिलागुफा; अधिक जानकारी के लिए देखें। चेतावनी : यह समाधान अभी भी मूल्य के साथ संपत्ति का इलाज नहीं करता अपरिभाषित ठीक से (जैसे {foo: undefined} ), लेकिन यह ज्यादातर मामलों के लिए ठीक होना चाहिए।
Comments
Post a Comment