JavaScript Mehrere Objekte in Array ansprechen

2TAKTER

Lt. Junior Grade
Registriert
Okt. 2005
Beiträge
399
Hallo zusammen,

ich habe eine eigentlich einfach Sache vor mir. In Java ist die auch schnell erledigt aber in JS treibt sie mich gerade in den Wahnsinn.

So befülle ich mein Array mit mehreren Objekten:
Code:
	var aCatalogues = [];
	while(!rs.eof)
	{
		var oCatalogue = { id: rs.fields(0), name: rs.fields(1), expire: rs.fields(2), validfrom: rs.fields(3), validtill: rs.fields(4) };
		aCatalogues.push(oCatalogue);
		rs.movenext;
	}
	rs.close;
	connection.close;

jedes einzelne oCatalogue Objekt ist valide. Die Ausgabe von
Code:
document.write(oCatalogue.id)
innerhalb der Schleife ist tadellos!

Mein Problem ist nun die Ausgabe.
Code:
	for ( var i = 0; i < aCatalogues.length; i++) {
		document.write(aCatalogues[i]); // gibt mir [object Object] aus, logo
		document.write(aCatalogues[i]['id']); // gibt mir undefined
		document.write(aCatalogues[i].id); // gibt mir undefined
	}

Wieso bekomme ich bei den beiden unteren undefined?
Ich kann mir alle Keys beider im Array gespeicherten Objekte problemlos anzeigen lassen:
Code:
	for ( var i = 0; i < aCatalogues.length; i++) {
		for (j in aCatalogues[i]) document.write(j) // ergibt idnameexpirevalidfromvalidtillidnameexpirevalidfromvalidtill 
	}
Also wie man im Kommentar sieht bekomme ich zwei mal id, name, expire, validfrom, validtill (habe zwei Einträge in der Datenbank). Ich komme aber einfach nicht an die Werte. Ich habe es auch schon in dieser Schleife mit aCatalogues.j und aCatalogues.[j] probiert, aber keine Chance, es ist immer undefined.

Ich bin für jede Hilfe dankbar.
 
Auf W3Scools lese ich unter dem Punkt "The Fields Collection's Properties", dass du falsch auf die Fields zugreifst.
Es sollte wohl "rs.fields.item(0)" statt "rs.fields(0)" (usw) sein.

Dann sind die Values/Werte der Properties der Objekte natürlich auch undefined, die Schlüssel/Keys aber vorhanden :)
 
Zuletzt bearbeitet:
Die Eigenschaften sind da, aber sie haben alle den Wert undefined.

Probier mal an passender Stelle: console.debug(aCatalogues);
 
http://jsfiddle.net/L8x9jh5q/ Die Initialisierung ist zwar... naja, aber ok :D

Funktioniert bei mir, eventuell ist die Zuweisung falsch o.ä.? Benutze einfach mal console.log statt document.write und öffne den Debugger, dann kannst du teilweise genaueres sehen...
 
Danke, ich habe das ganze mal so umgestellt:
Code:
	var aCatalogues = [];
	while(!rs.eof)
	{
		var oCatalogue = { id: rs.fields.item(0), name: rs.fields.item(1), expire: rs.fields.item(2), validfrom: rs.fields.item(3), validtill: rs.fields.item(4) };
		aCatalogues.push(oCatalogue);
		rs.movenext;
	}

	rs.close;
	connection.close;

	//document.write(aCatalogues + ' - ' + aCatalogues.length + '<br />')

	for ( var i = 0; i < aCatalogues.length; i++) {
		var oCat = aCatalogues[i]
		for (j in oCat) document.write(oCat.j)
	}

Wenn ich mir in der ersten Schleife die Values raus schreiben lasse klappt es, also mit
Code:
oCatalogue.id

Aber in der zweiten Schleife schaffe ich es nicht mehr.
Wenn ich mir "j" ausgeben lasse sehe ich alle Keys korrekt, nur die Felder sind noch immer undefined.
 
"oCat.j" sucht die ja den value für den Key "j" anstatt die Variable aufzulösen, hast du es hier jetzt auch schon mit der Klammer-Notation (oCat[j]) versucht?
 
FranzvonAssisi schrieb:
http://jsfiddle.net/L8x9jh5q/ Die Initialisierung ist zwar... naja, aber ok :D

Funktioniert bei mir, eventuell ist die Zuweisung falsch o.ä.? Benutze einfach mal console.log statt document.write und öffne den Debugger, dann kannst du teilweise genaueres sehen...

Also ich habe mal dein Beispiel mit aufgenommen, da klappt alles super.
Ich habe eines der manuellen Objekte von dir mit eingefügt.

Code:
	var aCatalogues = [];
	var oCatalogue = { id: 6, name: "Äpfel", expire: null, validfrom: null, validtill: null };
	aCatalogues.push(oCatalogue);
	console.log('Null: ' + aCatalogues[0].id)
	
	while(!rs.eof)
	{
		var oCatalogue = { id: rs.fields.item(0), name: rs.fields.item(1), expire: rs.fields.item(2), validfrom: rs.fields.item(3), validtill: rs.fields.item(4) };
		console.log('oCatalogue.id: ' + oCatalogue.id)
		aCatalogues.push(oCatalogue);
		rs.movenext;
	}
	rs.close;
	connection.close;
	
	for ( var i = 0; i < aCatalogues.length; i++) {
		console.log('letzte Schleife: ' + aCatalogues[i].id)
	}

In der console bekomme ich nun folgendes:
LOG: Null: 6
LOG: oCatalogue.id: {2415C84C-827C-E511-B0A7-B00594FCF204}
LOG: oCatalogue.id: {2515C84C-827C-E511-B0A7-B00594FCF204}
LOG: letzte Schleife: 6
LOG: letzte Schleife:
LOG: letzte Schleife:

Es sieht also wirklich nach der Zuweisung aus... mist

EDIT: GELÖST!
Es lag tatsächlich an der Zuweisung.
Code:
	while(!rs.eof)
	{
		tmpId = new String(rs.Fields.Item('CAT_Id'))
		var oCatalogue = { id: tmpId,
Dammit funktioniert es. Ich wandel also erstmal alle Items in einen String um, bevor ich sie in das Objekt speicher. Sprich die Syntax war richtig nur JS hat den String als Objekt behandelt... ARGH.
 
Zuletzt bearbeitet: (GELÖST)
Zurück
Oben