# [JS] Objekt existiert (keine festen Objektwerte!)



## Bizarrus (30. Jan 2013)

Huhu 

Da ich leider momentan probleme mit dem Internet habe und ich deshalb nicht überall drauf komme, dachte ich mal:


> Hey, schaust' mal bei JF vorbei, handelt sich zwar um JS, aber die haben doch auch ein JS Unterforum



Also, ich möchte gerne Objekte "variabel" speichern.


```
var objekt	= {}; // Initalisierung
var name	= "hallo"; // Dies soll gecheckt werden

if(typeof(objekt.name) !== 'undefined') { // EDIT: Vergessen :P
	// Wenn das Objekt existiert, hinzufügen!
	objekt.name.push("NEUER WERT");
} else {
	 // Wenn das Objekt nicht existiert, hinzufügen
	objekt.name = [];
	objekt.name.push("NAGELNEUER WERT");
}
```

Wäre derartiges möglich?
Problem dabei ist, dass "name" nicht "name" im Objekt ist, sondern ein String ist.

*Beispiel:*
Ich gehe Input fields durch, wo der name-value pair in einem objekt gespeichert werden.
Hier habe ich das Problem bei Array-Inputs, also Inputs, die als Array versendet werden:

```
<input type="text" name="price[]" value="" />
<input type="text" name="price[]" value="" />
<input type="text" name="price[]" value="" />
```

Jetzt hab ich mir gedacht: Nimmst'e eine Hilfsvariable, was bei jedem Input-Array (wenn dieses noch ned behandelt wurde) ein neuen Eintrag im Objekt macht und dort hochzählt.

*Besseres Beispiel:*

```
var objekt	= {}; // Initalisierung

// Hier werden alle Inputs durchgegangen
for(/**/) {
	if(typeof(objekt.name) !== 'undefined') {
		// Wenn das Objekt existiert, +1
		objekt.name++;
	} else {
		 // Wenn das Objekt nicht existiert, 0 setzen
		objekt.name = 0;
	}
}
```
*
Edit:*
Mir fält gerade ein, kann ich hierfür nicht einfach eval'n?
Sprich:

```
eval("objekt." + name + " = 0");
```


----------



## Evil-Devil (30. Jan 2013)

Was ist jetzt das genaue Problem, das du "price[]" nicht via objekt.price[] ansteuern kannst oder das du nicht weißt wie du es übertragen sollst?

Neben der Objekt-Punktnotation kannst du auch via objekt['price[]'] auf die jeweiligen Eigenschaften zugreifen.


----------



## Bizarrus (30. Jan 2013)

> Was ist jetzt das genaue Problem, das du "price[]" nicht via objekt.price[] ansteuern kannst [...]



Richtig, genau dies ist es.
Ich hatte es mir einfach gemacht und habe jQuery genommen. Ich habe dort aber ein Problem mit input-Arrays.

Ich habe ein Div mit einer Form (.wp_popup) und lese dort die Forms aus um die Inhalte zu bekommen - Diese werden dann später über ein Ajax-Req weitergegeben.

```
$(this).unbind("click").click(function() {
		if(hb_core.getClassStart($(this).attr("class"), "success")) {
			var forms			= 0;
			var data			= {};
			var count			= 0;
			var data_i			= 0;
			var webimage_failed	= false;
						
			$.map($("div.wb_popup form").serializeArray(), function(n, i){
				if(inline_uploader == true) {
					data[data_i]		= n;
				} else {
					data[n['name']]		= n['value'];
				}
							
				if((data['set'] == "web" || data['data[set]'] == "web") && (data['image_url'] == "http://" || data['data[image_url]'] == "http://")) {
					webimage_failed = true;
				}
							
				data_i++;
			});

			console.log(data);
		}

		// ...
	});
```

Das Problem mit dem mapping über jQuery habe ich (da ich es erst seit heute verwende) mit Input-Arrays - Ich bekomme folgendes Objekt:






Die Frage ist, wo sind die anderen Einträge?
tax[] gibt es nämlich in diesem Beispiel 3x:


----------



## Evil-Devil (30. Jan 2013)

Uff, wie jQuery mit Arrays umgeht weiß ich gar nicht. Hast du schon geschaut was passiert, wenn du es ohne die Array Notation schreibst? Oder was sagt die jQuery Dokumentation zu dem Thema? Im schlimmsten Fall musst du dich um die Handhabung der Formular Array Felder nach jQuery selbst kümmern.

Zum Beispiel so.

```
var taxFields = [];
if (typeof meinForm['tax[]'] !== 'undefined') {
 for (var i=0, il=<meinForm['tax[]'].length; i<il; i++) {
  taxFields[i] = meinForm['tax[]'][i].value;
 }
}
```


----------



## Bizarrus (30. Jan 2013)

Hmm, ich glaube es liegt an den "Sonderzeichen", da anscheinend bei der Serialisierung urlencoded wird.

Wenn ich es mit einer normalen Serialation mache und replace:

```
data = $("div.wb_popup form").serialize().replace(/%5B%5D/g, '[]');
```
Funktioniert es, muss mich dann aber selbst darum kümmern, dass des dann wieder zum "Objekt" wird.


----------

