JavaScript [JSON] Array wird nicht erkannt

Timdaroxxa

Lieutenant
Registriert
März 2009
Beiträge
954
Hey,

wieso steht dort bei "phonenumbers" Array[0] bzw. Array[2] und darunter jeweils "undefined"? (s. Anhang)

Bin gerade am Verzweifeln :D

Gruß
Tim
 

Anhänge

  • wtf.png
    wtf.png
    17,3 KB · Aufrufe: 229
Weil es diese Variable nicht gibt? Der Wert scheinbar nicht richtig gesetzt. Keine Ahnung das ist jetzt mal blöd geraten, weil mit einem Screenshot wird dir keiner wirklich helfen können / wollen.
 
Okay, kannst du mir dann wenigstens sagen, warum dann noch Array[2] dort steht, wenn der Wert nicht gesetzt ist?

Code:
[
    {
        "id": 1,
        "name": "Work",
        "phonenumbers": [],
        "emails": []
    },
    {
        "id": 2,
        "name": "sdsadasdasdsad",
        "phonenumbers": [
            {
                "id": 1,
                "value": "2131233"
            },
            {
                "id": 2,
                "value": "12321321312"
            }
        ],
        "emails": [
            {
                "id": 3,
                "value": "asdasd"
            }
        ]
    }
]

Hatte ich vergessen...
Es handelt sich übrigens um die response eines Ajax Requests über Backbone!
 
Code:
        "emails": [
            {
                "id": 3,
                "value": "asdasd"
            }
        ]
Erzeugt dir ein Array wegen den Eckigen Klammern darum auch das Array[2]. Im Ersten Teil entsprechend genauso. Entferne mal die eckigen Klammern bei Emails, dann kriegst du ein Objekt und kannst auf den Value zugreifen, wobei die ID in dem Fall aus konzeptioneller Sicht sinnfrei ist, da die Email ja einer ID des Eintrags (in dem Fall: 2) zugeordnet wird.
 
Danke für die Antwort.
Was mich allerdings eher beschäftig ist, dass in dem Screenshot oben die Chrome-Konsole bei phonenumbers und emails undefined angezeigt wird...
 
Zuletzt bearbeitet:
Nochmal: Ohne den dazugehörigen JavaScript Code ist das alles nur so halb geraten und ich weiß nicht 100%ig was du machen möchtest bzw. wie du es umsetzt....
 
Okay, sry das ich dir kein Code gepostet habe, aber ich wusste nicht, welcher Teil relevant ist und kann nicht alles posten.
Jedenfalls habe ich jetzt herausgefunden, warum der Fehler aufgetreten ist:

Wenn ich folgendes ausführe (es handelt sich um die parse Funktion eines Backbone Models und response sollte, soweit ich weiß, eine Response eines Jquery Ajax Requests sein):

Code:
parse: function(response) {
            console.log(response);
            if(this.get('phonenumbers') === undefined) {
                response.phonenumbers = new PhonenumberCollection(response.phonenumbers);
                response.phonenumbers = undefined;
            }
return response;
}

Dann gibt er mir für reponse.phonenumbers undefined aus.
Kannst du mir sagen, warum das so ist?
 
1.) api.jquery.com/jQuery.get/
2.) Wenn Phonenumbers undefined ist, sprich der Wert dafür nicht existiert, setzt du die Variable auf Undefined. Darum erhälst du ja auch das undefined. Ersetzt du das Undefined durch z.B. "", kriegst du entsprechend einen leeren String.
 
edit: hier stand Müll

Mir ist jedoch nicht ganz klar, warum du response.phonenumbers auf undefined setzt.
 
Zuletzt bearbeitet:
@SymA: Spielt die Reihenfolge keine Rolle? (d.h. console.log vor response.phonenumbers = undefined)

@carom: Backbone kann doch keine Collections in Models, bzw. Nested Collections sinnvoll vom Server abrufen..., deswegen kümmert sich die parse() Funktion, um das sinnvolle interpretieren!
Ergänzung ()

@carom: Das ist natürlich nicht sinnvoll, das habe ich mittlerweile auch schon geändert. Mir geht es eher darum, warum eben die Konsoleausgabe aus Post 1 so zustande kommt. Der Code soll nur zur Reproduktion der Ausgabe dienen!

Im Prinzip hatte ich mir vorgestellt, dass das Script von oben nach unten durchläuft. D.h. erst die Ausgabe und dann wird der Wert auf undefined gesetzt.
 
Zuletzt bearbeitet:
Achso, sag das doch gleich.

console.log() liefert dir keinen "Snapshot", das mag zunächst seltsam erscheinen*. Wenn sich nach dem Aufruf etwas ändert und die Ausgabe nicht schnell genug ist, dann bekommst du andere, aktuellere Werte von dem, was du loggen möchtest. Du könntest clone aufrufen, um eine Kopie der Antwort zu erstellen, diese könntest du dann mit console.log ausgeben. Das ist auch der Grund, warum das ganze nicht so funktioniert, wie von dir erwartet: console.log müsste für jeden Parameter eine Kopie erstellen, das ist aber ziemlich teuer. Also wird nur eine Art Referenz übergeben, und was dort drin steht muss nicht mehr das sein, was beim Aufruf von console.log drinstand.

Wenn du das debuggst und bei dem Log-Aufruf einen Breakpoint setzt, dann sollte die Antwort aber unverändert ersichtlich sein.

* und hängt von der Implementierung ab. In den meisten Browsern ist es "non-Blocking".
 
Zuletzt bearbeitet:
Vielen Dank für die Antwort. Das erklärt natürlich alles!

Damit hat sich das Thema!
 
Zurück
Oben