juppix: Durch JSON iterieren (loopen)

Heyho... wieder er...:

Ich habe ein JSON:

[
{
name: "Riesser",
vorname: "Ahamed",
text_long: "Boss"
},
{
name: "Hetz",
vorname: "Ralf",
text_long: "Manager"
},
{
name: "Soller",
vorname: "Hans",
text_long: "Junior"
}
]

Dies erhalte ich per AJAX-Request.

Da mehr als 1 Wert zurück kommen kann (hier im Beispiel 3), möchte ich nun durch die Werte "laufen" und etwas damit machen.

Leider klappt mein Code nicht ganz (kein Console-Log - es wird nix gefunden obwohl natürlich JSON zurück geliefert wird.):

$.ajax({
            type:'GET',
            url:'getUserInfo.php?UserId=' + $("#SelectKonto option:selected").val() + '&datum=' + $("#Datepicker").val(),
            dataType: "json",			            
            success: function(data){
				//console.log(data.length);
				if(data.length = 0) {
					console.log('no data');
				} else { 
					console.log('data');
					
					for (var key in data) {
						if (p.hasOwnProperty(key)) {
							console.log(key + " -> " + p[key]);
							// MACH HIER ETWAS !!
						}
					}	
				}
				
      },
			error: function() { 
					alert("Error!: WriteError()"); 
			}       			
        });

Kann mir jemand auf die Sprünge helfen?

1000 Dank vorab 😀

akzeptierte Antworten

  1. hallo

      			for (var key in data) {
      				if (p.hasOwnProperty(key)) {
      					console.log(key + " -> " + p[key]);
      					// MACH HIER ETWAS !!
      				}
      			}	
    

    data ist ein Array, kein Object.

    Erst die einzelnen data Items sind Objects.

    --
    Neu im Forum! Signaturen kann man ausblenden!
  2. Tach!

    Ich habe ein JSON:

    Erstmal, dass es JSON ist, ist für das Problem irrelevant. JSON ist es nur für den Transport, und du bekommst ganz normale Daten in Javascript-Typen.

    [
    {
    name: "Riesser",
    vorname: "Ahamed",
    text_long: "Boss"
    },
    {
    name: "Hetz",
    vorname: "Ralf",
    text_long: "Manager"
    },
    {
    name: "Soller",
    vorname: "Hans",
    text_long: "Junior"
    }
    ]
    

    Das wird konvertiert zu einem Array mit drei Elementen, die Objekte sind.

    					for (var key in data) {
    						if (p.hasOwnProperty(key)) {
    							console.log(key + " -> " + p[key]);
    							// MACH HIER ETWAS !!
    						}
    					}	
    

    Da sollte zumindest length kommen, denn du versuchst mit diesem Code über die Eigenschaften des Arrays zu iterieren. Das hat aber außer length keine (eigenen). Stattdessen möchtest du beispielsweise die Methode forEach() nehmen, um über die Elemente des Arrays zu iterieren.

    data.forEach(function(element) {
      console.log(element);
    });
    

    dedlfix.

    1. Passiert nix wenn ich den code ausführe:

       success: function(data){
      			//console.log(data.length);
      			if(data.length = 0) {
      				console.log('no data');
      			} else { 
      				console.log('data');
      				
      				data.forEach(function(element) {
      				  console.log(element);
      				});
      			}
      

      Es wird lediglich "data" in der console geloggt. 😟

      1. hallo

        Passiert nix wenn ich den code ausführe:

         success: function(data){
          		//console.log(data.length);
          		if(data.length = 0) {
        

        Hier ist etwas logisch falsch!

        --
        Neu im Forum! Signaturen kann man ausblenden!
        1. Verstehe ich nicht ganz was Du meinst.

          In diesem Code wird "data ok!" ja schon korrekt ausgegeben. Jedoch scheint die forEach-Schleife nicht zu laufen…

             success: function(data){
          			//console.log(data.length);
          			if(data.length = 0) {
          				console.log('no data!');
          			} else { 
          				console.log('data ok!');
          				
          				data.forEach(function(element) {
          				  console.log(element);
          				});
          			}
             }
          
          1. hallo

            Verstehe ich nicht ganz was Du meinst.

            In diesem Code wird "data ok!" ja schon korrekt ausgegeben. Jedoch scheint die forEach-Schleife nicht zu laufen…

               success: function(data){
              		//console.log(data.length);
              		if(data.length = 0) {
              			console.log('no data!');
              		} else { 
              			console.log('data ok!');
            
              		}
               }
            
            var o = [];
            if(o.length=0){alert("0")}
            else(alert("!0"))
            

            Willst du wetten, welche Alert-Box ausgegeben wird?

            --
            Neu im Forum! Signaturen kann man ausblenden!
            1. LOL! Cool. Daaanke!

              Aber wie frage ich denn nun ab ob data Elemente hat (also nicht leer ist)?

              1. hallo

                LOL! Cool. Daaanke!

                Aber wie frage ich denn nun ab ob data Elemente hat (also nicht leer ist)?

                negativer Test

                o.length == 0

                positiver Test

                o.length > 0

              2. Tach!

                Aber wie frage ich denn nun ab ob data Elemente hat (also nicht leer ist)?

                Gar nicht. Du iterierst einfach drüber (eventuell ein Test auf null/undefined). Es sei denn, du möchtest bei 0 Elementen etwas anderes als nichts darstellen.

                dedlfix.

                1. hallo

                  Tach!

                  Aber wie frage ich denn nun ab ob data Elemente hat (also nicht leer ist)?

                  Gar nicht. Du iterierst einfach drüber (eventuell ein Test auf null/undefined). Es sei denn, du möchtest bei 0 Elementen etwas anderes als nichts darstellen.

                  Du willst sagen, Man will eben nicht etwas Überflüssiges (etwa eine leere Tabelle) präsentieren, wenn keine Daten vorliegen

                  Aber da solche Typos (= statt ==) so verbreitet sind, und schwer zu bemerken sind, hier eine Referenz

                  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators

                  Kann ja nicht schaden...

                  --
                  Neu im Forum! Signaturen kann man ausblenden!
          2. @@juppix

            In diesem Code wird "data ok!" ja schon korrekt ausgegeben.

              		if(data.length = 0) {
              			console.log('no data!');
              		} else { 
              			console.log('data ok!');
            

            Natürlich. Du weist data.length den Wert 0 zu. Dieser Wert wird auch als Ergebnis der Zuweisung zurückgegeben. 0 ist falsy, d.h. bei if(0) landest du immer im else-Zweig, es wird immer „data ok!“ ausgegeben.

            Du möchtest nicht zuweisen, sondern vergleichen: ===.

            LLAP 🖖

            --
            „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
            1. Natürlich. Du weist data.length den Wert 0 zu. Dieser Wert wird auch als Ergebnis der Zuweisung zurückgegeben. 0 ist falsy, d.h. bei if(0) landest du immer im else-Zweig, es wird immer „data ok!“ ausgegeben.

              Das erklärt wieso der else-Zweig betreten wird, es erklärt auch warum die for-Schleife nicht ausgeführt wird: Mit data.length = 0 werden alle Elemente aus dem Array gelöscht.

      2. Tach!

          			console.log('data');
        

        Es wird lediglich "data" in der console geloggt. 😟

        Dann lass dir anzeigen, was in data wirklich enthalten ist, also console.log(data).

        dedlfix.