2009-07-03 15 views
386

Mam następującą strukturę JSON:Jak wykonać iterację struktury JSON?

[{ "id":"10", "class": "child-of-9" }, { "id": "11", "classd": "child-of-10" }] 

Jak iteracyjne nad nim przy użyciu jQuery lub JavaScript?

+0

http://stackoverflow.com/questions/1050674/fastest-way-to-iterate-through-json-string-in-javascript – Max

+5

"jquery lub javascript" ? jquery jest napisane w javascript! –

+6

Powinien to być "jQuery lub czysty JavaScript". – rsb2097

Odpowiedz

370

Zrobione z jQuery docs: przykład

var arr = [ "one", "two", "three", "four", "five" ]; 
var obj = { one:1, two:2, three:3, four:4, five:5 }; 

jQuery.each(arr, function() { 
    $("#" + this).text("My id is " + this + "."); 
    return (this != "four"); // will stop running to skip "five" 
}); 

jQuery.each(obj, function(i, val) { 
    $("#" + i).append(document.createTextNode(" - " + val)); 
}); 
+129

Jest to bardzo myląca składnia. Czy możesz to wyjaśnić? Czy możesz również podać dane wyjściowe? –

+82

Odpowiedź powinna być podana w JavaScript, a nie w JQuery. –

+18

@WayneHartman Sympatyzuję z twoim punktem widzenia, ale oryginalne pytanie mówi "jquery lub javascript". Wygląda na to, że błąd polegał na braku znacznika jquery na pytanie. – vlasits

12

MooTools:

var ret = JSON.decode(jsonstr); 

ret.each(function(item){ 
    alert(item.id+'_'+item.classd); 
}); 
9

Można użyć mini bibliotekę jak objx - http://objx.googlecode.com/

można napisać kod tak:

var data = [ {"id":"10", "class": "child-of-9"}, 
       {"id":"11", "class": "child-of-10"}]; 

// alert all IDs 
objx(data).each(function(item) { alert(item.id) }); 

// get all IDs into a new array 
var ids = objx(data).collect("id").obj(); 

// group by class 
var grouped = objx(data).group(function(item){ return item.class; }).obj() 

Są bardziej 'wtyczki' dostępne pozwalają obsługiwać dane, takie jak ten, patrz http://code.google.com/p/objx-plugins/wiki/PluginLibrary

446
var arr = [ {"id":"10", "class": "child-of-9"}, {"id":"11", "classd": "child-of-10"}]; 

for (var i = 0; i < arr.length; i++){ 
    var obj = arr[i]; 
    for (var key in obj){ 
     var attrName = key; 
     var attrValue = obj[key]; 
    } 
} 

var arr = [ {"id":"10", "class": "child-of-9"}, {"id":"11", "class": "child-of-10"}]; 
 
    
 
for (var i = 0; i < arr.length; i++){ 
 
    document.write("<br><br>array index: " + i); 
 
    var obj = arr[i]; 
 
    for (var key in obj){ 
 
    var value = obj[key]; 
 
    document.write("<br> - " + key + ": " + value); 
 
    } 
 
}

uwaga: metoda in jest cool dla prostych obiektów. Niezbyt inteligentny w użyciu z obiektem DOM.

+5

Nie zapomnij sprawdzić bezpośrednio wewnątrz pętli 'for key in obj'' obj.hasOwnProperty (key) '--- w innym dniu możesz znaleźć inne klucze działające w' obj', którego nie chcesz , jeśli ktoś przedłuży prototyp, na przykład ... – Funka

+0

Hi mogę po prostu zapytać, czy chcę tego użyć, aby uzyskać zdalną tablicę Json, jak to zrobić? proszę, daj mi wskazówki! –

+2

, ale arr nie jest JSON. –

68

Zastosowanie foreach:

<html> 
<body> 
<script type="text/javascript"> 
var mycars = [{name:'Susita'}, {name:'BMW'}]; 
for (i in mycars) 
{ 
    document.write(mycars[i].name + "<br />"); 
} 
</script> 
</body> 
</html> 

spowoduje:

Susita 
BMW 
+7

Susita jest zmienną zależną od kultury, prawda? :-) – GilShalit

+2

W prawo, zmienna najwyższego poziomu, taka jak BMW ;-) –

+4

To jest regularna tablica, a nie JSON. – jonasespelita

3

Innym rozwiązaniem, aby poruszać się po dokumentach JSON jest JSONiq (realizowany w silniku Zorba), gdzie można napisać coś podobnego :

let $json := [ {"id":"10", "class": "child-of-9"}, 
       {"id":"11", "class": "child-of-10"} ] 
for $entry in jn:members($json)  (: binds $entry to each object in turn :) 
return $entry("class")    (: gets the value associated with "class" :) 

Można go uruchomić na http://www.zorba-xquery.com/html/demo#AwsGMHmzDgRpkFpv8qdvMjWLvvE=

35

Jeśli jest to Twoja dataArray:

var dataArray = [{"id":28,"class":"Sweden"}, {"id":56,"class":"USA"}, {"id":89,"class":"England"}]; 

następnie:

$(jQuery.parseJSON(JSON.stringify(dataArray))).each(function() { 
     var ID = this.id; 
     var CLASS = this.class; 
}); 
+0

Najlepsza odpowiedź przy użyciu JQuery. Koduje dane z backendu za pomocą AJAX, więc nie użyłem funkcji "stringify". Kod jasny i piękny! – danigonlinea

7

Z zagnieżdżonych obiektów, można go pobrać za pomocą funkcji rekurencyjnej:

function inside(events) 
    { 
    for (i in events) { 
     if (typeof events[i] === 'object') 
     inside(events[i]); 
     else 
     alert(events[i]); 
    } 
    } 
    inside(events); 

gdzie jako zdarzenia znajduje się obiekt json.

+1

Świetnie. Wystarczy, aby to wspomniano; jeśli odczytasz zmienną (i), możesz uzyskać nazwy właściwości (na ile to jest warte) – netfed

8

To jest czysty komentarz do JavaScript.

<script language="JavaScript" type="text/javascript"> 
    function iterate_json(){ 
      // Create our XMLHttpRequest object 
      var hr = new XMLHttpRequest(); 
      // Create some variables we need to send to our PHP file 
      hr.open("GET", "json-note.php", true);//this is your php file containing json 

      hr.setRequestHeader("Content-type", "application/json", true); 
      // Access the onreadystatechange event for the XMLHttpRequest object 
      hr.onreadystatechange = function() { 
       if(hr.readyState == 4 && hr.status == 200) { 
        var data = JSON.parse(hr.responseText); 
        var results = document.getElementById("myDiv");//myDiv is the div id 
        for (var obj in data){ 
        results.innerHTML += data[obj].id+ "is"+data[obj].class + "<br/>"; 
        } 
       } 
      } 

      hr.send(null); 
     } 
</script> 
<script language="JavaScript" type="text/javascript">iterate_json();</script>// call function here 
7

Marki Marquis Wang może być najlepszą odpowiedzią podczas korzystania z jQuery.

Oto coś bardzo podobnego w czystym JavaScript, używając metody JavaScript forEach. forEach przyjmuje funkcję jako argument. Funkcja ta będzie następnie wywoływana dla każdego elementu w tablicy, z wymienioną pozycją jako argumentem.

Krótkie i proste:

<script> 
var results = [ {"id":"10", "class": "child-of-9"}, {"id":"11", "classd": "child-of-10"}]; 

results.forEach(function(item) { 
    console.log(item); 
    }); 
</script> 
46

Proszę dać mi znać, jeśli to nie jest łatwe:

var jsonObject = { 
     name: 'Amit Kumar', 
     Age: '27' 
    }; 
    for (var prop in jsonObject) { 
     alert("Key:" + prop); 
     alert("Value:" + jsonObject[prop]); 
    } 
+14

Twój obiekt jsonObject nie jest prawdziwym obiektem JSON. Jest to obiekt javascript.Właśnie dlatego to działa. Jednak jeśli ktoś ma obiekt JSON, może go przekonwertować na obiekt JS, a następnie użyć swojej metody. Aby przekonwertować obiekt JSON na obiekt JS, użyj jsObject = JSON.parse (jsonObject); – prageeth

+1

Jeśli uzyskałeś dane przez jQuery.getJSON(), działa to dobrze. –

1
var jsonString = "{\"schema\": {\"title\": \"User Feedback\", \"description\":\"so\", \"type\":\"object\", \"properties\":{\"name\":{\"type\":\"string\"}}}," + 
         "\"options\":{ \"form\":{\"attributes\":{}, \"buttons\":{ \"submit\":{ \"title\":\"It\", \"click\":\"function(){alert('hello');}\" }}} }}"; 
var jsonData = JSON.parse(jsonString); 

function Iterate(data) 
{ 
    jQuery.each(data, function (index, value) { 
     if (typeof value == 'object') { 
      alert("Object " + index); 
      Iterate(value); 
     } 
     else { 
      alert(index + " : " + value); 
     } 
    }); 

}; 

Iterate(jsonData); 
+2

Powinieneś wyjaśnić swój kod. Odpowiedź bez wyjaśnienia niewiele pomaga. – Reeno

10

skopiowany i wklejony z http://www.w3schools.com, nie ma potrzeby obciążania jQuery.

var person = {fname:"John", lname:"Doe", age:25}; 

var text = ""; 
var x; 
for (x in person) { 
    text += person[x]; 
} 

WYNIK: John Doe 25

Powiązane problemy