2010-11-05 15 views
5

एक वेब सेवा से ये नेस्टेड json वस्तु का उपयोग किए बिना JSON नेस्ट:मुद्रण चर नाम

for (var data in json_data) { 
    alert("Key:" + data + " Values:" + json_data[data]); 
} 
:

{"age":"21-24","gender":"Male","location":"San Francisco, CA","influencer score":"70-79","interests":{"Entertainment":{"Celebrities":{"Megan Fox":{},"Michael Jackson":{}},},"Social Networks & Online Communities":{"Web Personalization": {},"Journals & Personal Sites": {},},"Sports":{"Basketball":{}},},"education":"Completed Graduate School","occupation":"Professional/Technical","children":"No","household_income":"75k-100k","marital_status":"Single","home_owner_status":"Rent"} 

मैं सिर्फ संपत्ति नाम निर्दिष्ट किए बिना इस वस्तु के माध्यम से पुनरावृति करना चाहते हैं, मैं निम्नलिखित कोड की कोशिश की

हालांकि यह एक ऑब्जेक्ट ऑब्जेक्ट के रूप में मूल्य को प्रिंट करता है यदि यह नेस्टेड मान है, तो क्या नेस्टेड मानों में गहराई से रखने के लिए कोई तरीका है?

उत्तर

6

इस प्रयास करें:

function iter(obj) { 
    for (var key in obj) { 
    if (typeof(obj[key]) == 'object') { 
     iter(obj[key]); 
    } else { 
     alert("Key: " + key + " Values: " + obj[key]); 
    } 
    } 
} 

बी बी: ​​जोड़ा + त्रुटि को रोकने के लिए।

function alertObj(obj) { 
    for (var data in obj) { 
     if(typeof(obj[data]) === "object") 
      alertObj(obj[data]); 
     else 
      alert("Key:" + data + " Values:" + obj[data]); 
    } 
} 

जब तक आप बहुत दूर (जो आप शायद JSON वस्तुओं के साथ की जरूरत नहीं है) recursing के बारे में चिंतित नहीं हैं:

+0

टाइपफ़ोफ़ (कुछ ऑब्जेक्ट) "ऑब्जेक्ट" "ऑब्जेक्ट" नहीं दिया है ... लोअरकेस "ओ" –

+0

अच्छी पकड़ लें। :) धन्यवाद! –

3

आप इसे बार-बार कर सकते हैं।

function alertobjectKeys(data) { 
    for (var key in data) { 
    if (typeof(data[key]) == "object" && data[key] != null) { 
     alertobjectKeys(data[key]); 
    } else { 
     alert("Key:" + key + " Values:" + data[key]); 
    } 
    } 
} 
+0

अपने नेस्टेड कॉल के अंदर आपको डेटा की आवश्यकता है [कुंजी] - अन्यथा आप जो वही ऑब्जेक्ट प्राप्त करते हैं उसे दोहराते हैं। –

+0

@ g.d.d.c ... धन्यवाद ... मैंने इसे –

0

तुम हमेशा एक पुनरावर्ती समारोह बना सकते हैं।

तुम भी एक कतार या स्टैक (सरणी) संरचना के साथ ऐसा कर सकते हैं:

function alertObj_queue(obj) { // Breadth-first 
    var arrPrint = [{key:"Object", data:obj}]; // Initialize array with original object 

    for(var i = 0; i < arrPrint.length; i++) { 
     if(typeof(arrPrint[i].data) === "object") { 
      for(var k in arrPrint[i].data) { // Add each to end of array 
       arrPrint.push({key: k, data: arrPrint[i].data[k]}); 
      } 
      alert("Object key: " + arrPrint[i].key); 
     } else { 
      alert("Key:" + arrPrint[i].key + " Values:" + arrPrint[i].data); 
     } 
    } 
} 

function alertObj_stack(obj) { // Depth-first 
    var arrPrint = [{key:"Object", data:obj}]; // Initialize array with original object 

    while(arrPrint.length) { 
     var o = arrPrint.pop(); 
     if(typeof(o.data) === "object") { 
      for(var k in o.data) { // Add each to end of array 
       arrPrint.push({key: k, data: o.data[k]}); 
      } 
      alert("Object key: " + o.key); 
     } else { 
      alert("Key:" + o.key + " Values:" + o.data); 
     }  
    } 
} 
+0

आपका कोड सही नहीं है। आप obj में पास करते हैं लेकिन अपने लूप में json_data का उपयोग करें .... json_data अपरिभाषित है। –

+0

दुर्भाग्यवश दोनों काम नहीं करते हैं, वे केवल प्रथम स्तर –

+0

@HeoQue के माध्यम से जाते हैं: आप केवल पहले स्तर पर अलर्ट देखते हैं क्योंकि आपके डेटा में, पहले स्तर के नीचे सब कुछ एक वस्तु है, इसलिए लूप "खेल" को देखेगा और देखें कि यह एक वस्तु है, फिर "बास्केट बॉल" पर जाएं और देखें कि यह एक वस्तु भी है, इसलिए यह उनमें से किसी के लिए 'सतर्क नहीं' होगी। यह शायद आपके कुछ JSON डेटा को सरणी ("खेल", "हस्तियाँ" इत्यादि) के रूप में आसान बनाना होगा। – palswim

0
निश्चित रूप से

यह प्रत्यावर्तन की आवश्यकता है

(function(obj) { 
    for (var key in obj) if (obj.hasOwnProperty(key)) { 
    if (typeof obj[key] == 'object' && obj[key] !== null) 
     arguments.callee(obj[key]); 
    else 
     alert("Key: " + key + " Values: " + obj[key]); 
    } 
)(json_data)); 
+0

** ** ** रिकर्सन की आवश्यकता नहीं है, लेकिन यदि आपका डेटा हास्यास्पद रूप से बड़ा नहीं है तो रिकर्सन सहायता कर सकता है। – palswim

0
function recursiveParse(variable) { 
    for (var key in variable) { 
     if ((is_object(variable[key])) || (is_array(variable[key]))) { 
      recursiveParse(variable[key]); 
     } else { 
      // Process variable here 
     } 
    } 
} 

तो बस पैरामीटर किया जा रहा है के साथ कि फ़ंक्शन को कॉल करें जेसन डेटा, यह शेष वस्तुओं और सरणी के माध्यम से बार-बार विश्लेषण करेगा।

+0

is_object() और is_array() के लिए परिभाषा कहां है? –

+0

एक और लाइब्रेरी में मैं आपको बताना भूल गया था लेकिन मैं इतना भूल गया कि मैं भूल गया कि यह मूल जावास्क्रिप्ट नहीं था। मैं क्षमाप्रार्थी हूं। –

0

मुझे लगता है कि आपके अनुरोध में (यह अजाक्स मान रहा है) आप डेटा टाइप को 'जेसन' के रूप में वापस नहीं कर रहे हैं।

संबंधित मुद्दे