2010-11-05 11 views
5

serwis internetowy zwraca następujący zagnieżdżonego obiektu json:Druk zagnieżdżone JSON bez używania nazw zmiennych

{"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"} 

Chcę po prostu iterację tego obiektu bez określania nazwy właściwości, próbowałem następujący kod:

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

jednak drukuje wartość jako [obiekt obiektowy], jeśli jest to wartość zagnieżdżona, czy istnieje sposób na dalsze iterowanie w głąb zagnieżdżonych wartości?

Odpowiedz

6

Spróbuj tego:

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

BB: dodano +, aby zapobiec błąd.

+0

typeof (someObject) zwraca "object", a nie "Object" ... Zwróć uwagę na małe litery "o" –

+0

Dobry połów. :) Dzięki! –

3

Możesz to zrobić rekurencyjnie.

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

Wewnątrz połączenia zagnieżdżonego potrzebujesz danych [klucz] - w przeciwnym razie po prostu powtarzasz ten sam otrzymany obiekt. –

+0

@ g.d.d.c ... dziękuję ... Naprawiłem to –

0

Zawsze można stworzyć rekurencyjną funkcję:

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

Dopóki nie martwi recursing zbyt daleko (czego zapewne nie trzeba z obiektów JSON).

Można również zrobić to z (tablica) struktury kolejki lub stosu:

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

Twój kod jest nieprawidłowy. Przechodzisz w obj, ale używaj json_data w pętli for ... json_data jest niezdefiniowana. –

+0

Niestety oba nie działają, przechodzą tylko przez 1. poziom –

+0

@HeoQue: Widzisz tylko alarmy na pierwszym poziomie, ponieważ w twoich danych wszystko poniżej pierwszego poziomu jest obiektem, więc pętla będzie wyglądała na "Sport" i zobacz, że jest to obiekt, a następnie przejdź do "Koszykówki" i zobacz, że jest to również obiekt, więc nie będzie "ostrzegać" o żadnym z nich. Prawdopodobnie ułatwi to niektóre z twoich danych JSON jako tablice ("Sport", "Gwiazdy" itp.). – palswim

0

To oczywiście wymaga rekursji

(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

Nie ** wymaga ** rekursji, ale rekursja może pomóc, jeśli twoje dane nie są śmiesznie duże. – 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 
     } 
    } 
} 

Następnie wystarczy wywołać tą funkcję z parametrem jest dane JSON będą analizować rekursywnie pozostałe obiekty i tablice.

+0

gdzie są definicje is_object() i is_array()? –

+0

W innej bibliotece zapomniałem ci o tym opowiedzieć, ale jestem tak przyzwyczajony, że zapomniałem, że to nie jest core javascript. Przepraszam. –

0

Zgaduję, że w Twojej prośbie (zakładając, że jest to Ajax) nie określasz typ danych zwracany jako "json".

Powiązane problemy