• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Erstellen eines mehrdimensionalen assoziativen Array

abcoris

New member
Hallo allerseits,

ich möchte ein mehrdimensionales assoziatives Array erstellen.
Auf die Werte 'z' des Array möchte ich zugreifen mit arrayname['x']['y'].

Alle Suche und alles Probieren führte zu keinem Erfolg.

Das Array soll in etwa so aussehen:

HTML:
var poiimages = new Array();
poiimages['accommodation'] = new Array();
poiimages['accommodation']['alpinehut'] = '11';
alert(poiimages['accommodation']['alpinehut']); // klappt
poiimages['accommodation']['bed and breakfast'] = '12';
alert(poiimages['accommodation']['bed and breakfast']); // klappt
poiimages['accommodation']['camping'] = '13';
alert(poiimages['accommodation']['camping']); // klappt
alert(poiimages['accommodation']);  // klappt nicht
poiimages['amenity'] = new Array();
poiimages['amenity']['court'] = '21';
poiimages['amenity']['police'] = '22';
poiimages['amenity']['town hall'] = '23';
...

alert(poiimages); // klappt nicht

Vielelicht habt Ihr eine Idee, was ich falsch mache.

Beste Grüße
Abcoris
 
Zuletzt bearbeitet von einem Moderator:
Verstehe die Frage nicht. Die korrekten funktionierenden Zugriffe hast du doch schon selbst gefunden. Und das alert(poiimages['accommodation']); und alert(poiimages); nicht klappen liegt daran, dass man mit dieser Syntax nicht eine ganze Struktur darstellen kann. Man muss das schon durch iterieren.
 
Assoziative Arrays macht man in JS auf keinen Fall mit "new Array()" (was man sowieso nie verwenden sollte), sondern mit Objekt(-literalen):
Code:
var poiimages = {
	accommodation: {
		alpinehut: 11,
		"bed and breakfast": 12,
		camping: 13
	},
	amenity: {
		court: 21,
		police: 22,
		"town hall": 23
	}
};

Wenn in dem Schlüssel keine Sonderzeichen/Leerzeichen/etc. vorkommen, kann man auch einfacher auf die Einträge zugreifen:
Code:
alert(poiimages.accommodation.alpinehut);

Was heißt denn genau "funktioniert nicht"? Da wird wahrscheinlich nichts ausgegeben, da du Array fälschlicher weise verwendet hast. Arrays sind nur für numerische Schlüssel geeignet. Wenn du das alert() bei einem Objekt machst, wird da nur "[object Object]" stehen. Eine recht gute Darstellung von Objekten bekommt man mit:
Code:
alert(JSON.stringify(poiimages, null, "\t"));
 
Naja... wenn du unbedingt viel schreiben willst... hat aber nicht den Nachteil von Array, dass der Konstruktor inkonsequent ist.
 
Vielen Dank für Eure Antworten!

Die Begriffe wie 'accommodation', 'bed and breakfast', 'amenity', 'court' usw. kenne ich beim Definieren des Arrays/Objektes nicht. Die Strings lese ich aus einer Datenbank aus. 'accommodation', 'amenity' usw. sind Hauptkategorien, dazu gehören jeweils Unterpunkte wie 'bed and breakfast', 'court' usw.. Zu diesen dann Imagenamen (im Beispiel bezeichnet mit 11, 12...). Die Haupt- und Unterkategorien können derzeit über zwei Comboboxen ausgewählt werden. Das zur Unterkategorie gehörende Image möchte ich Auslesen mit poiimages[Selection Combobox 1][Selection Combobox 2].

Bisher heissen die Imagenamen Die 'Hauptkategoriename_Unterkategoriename_image.png'. Das klappt, ist mir allerdings zu unflexibel, weshalb ich auf die Idee mit dem mehrdimensionalen assoziativen Array kam.

Nun bin ich mit meinem Latein am Ende.

@kkapsner: Hast Du eine Idee, wie man Deinen Ansatz generisch hinbekommt?
Leerzeichen kommen vor, macht sich für die Lesbarkeit in den Comboboxen besser. Sonderzeichen derzeit nicht.

Beste Grüße
Abcoris
 
Vielen Dank für Eure Antworten!

@kkapsner: Geht der Ansatz auch generisch? Ich kennen die Namen wie 'accomodation' usw. bei Definieren des Arrays/Objektes nicht. Die lese ich aus einer Datenbank aus. Über drei Comboboxen wird dann ein Imagename ausgewählt, welche ich auch aus der DB auslese. Derzeit klappt es,

wenn die Images der Struktur 'Combo1-Selection_Combo3-Selection_Farbe.png' entsprechen. Ist mir allerdings nicht flexibel genug, deshalb die Idee mit den multidimensionalen assoziativen Arrays.

Anbei ein Snapshot, wie es aussieht.

Beste Grüße
Abcoris
 

Anhänge

  • 2014_04_09_16_24_25_Beispiel2.jpg
    2014_04_09_16_24_25_Beispiel2.jpg
    527,8 KB · Aufrufe: 0
Vielen Dank für Eure Antworten!

@kkapsner
Kann man den Ansatz generisch machen? Die Begriffe 'accommodation' usw. kenne ich beim Definieren von poiimages nicht, Die Strings lese ich erst aus einer Datenbank aus.

Beste Grüße
Abcoris
 
Du kannst das Object doch einfach durchiterieren, dann hast du doch die Schlüssel:
HTML:
<!DOCTYPE html>
<html>
<head>
	<title>Beispiel abcoris</title>
	<meta http-equiv="content-type" content="text/html;charset=UTF-8">
	<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
</head>
<body>
	<div id="out"></div>
	<script>
		var poiimages = {
			accommodation: {
				alpinehut:				11,
				"bed and breakfast":	12,
				camping:				13
			},
			amenity: {
				court:			21,
				police:			22,
				"town hall":	23
			}
		};
		jQuery.each(poiimages,function(g) {
			if (typeof poiimages[g] == 'object') {
				jQuery.each(poiimages[g],function(z) {
					jQuery('#out').append(g+' -> '+z+' -> '+poiimages[g][z]+'<br>');
				});
			}
			else { jQuery('#out').append(g+' -> '+poiimages[g]+'<br>'); }
		});
	</script>
</body>
</html>
 
@kkapsner
Kann man den Ansatz generisch machen? Die Begriffe 'accommodation' usw. kenne ich beim Definieren von poiimages nicht, Die Strings lese ich erst aus einer Datenbank aus.

Ich weiß jetzt nicht genau, was du meinst.

Das Objektliteral baust du auf deinem Server zusammen. Da musst du hald schauen, was deine serverseitige Sprache anbietet. In PHP kannst du auch einfach ein assoziatives Array machen und dann mit json_encode() arbeiten.

Die Ausgabe mit JSON.stringify() funktioniert immer.
 
Zurück
Oben