Rene: Javascript Array, seltsames Phänomen

Hi, ich steh grad völlig auf dem Schlauch und komm nicht weiter. Ich hoffe, dass ihr mir weiterhelfen könnt.

Ich habe ein Suchformular, dass mir das Suchergebnis per AJAX als Array zurückliefert. In diesem Array befinden sich 0 bis X Objekte, also nichts besonderes. Das Suchergebnis übergebe ich an zwei Arrays

  
arrOnlineBookingPersonData[id_person] = ret;  
arrSearchResultSelectedPersondata[id_person] = ret;  
// ret = [{...},{...},{...}];  
// id_person = Datenbank-ID, z. B. 6495  

Danach zeige ich jedes Objekt (bzw. jeden Suchtreffer) aus dem Array arrOnlineBookingPersonData[id_person] als Tabelle an. Jede Eigenschaft eines Objektes (z. B. Name, Straße, Telefon) wird in einer Zeile angezeigt, z. B.
Name: Klaus

Durch Klick auf eine Eigenschaft (z. B. Name) möchte ich den Wert der Eigenschaft (z. B. Klaus) entweder aus dem Array arrOnlineBookingPersonData[id_person] oder aus einem vorhandenen Objekt objPerson übernehmen, so eine Art Umschalter. Das mache ich wie folgt:

  
// wechselt zwischen den vorhandenen und den vorhandenen Personendaten  
function togglePersonData(obj){  
   var id = obj.id; // ID der Person aus der Datenbank  
   var id_person = obj.id_person; // ID der vorhandenen Person  
   var inp = obj.inp; // zu tauschende Eigenschaft, z. B. lastname  
   var src = obj.src; // Quelle der Eigenschaft  
  
	// vorhanden Person  
	var per = objPerson;  
	if(per.id_customer_customer !== id_person){  
		for(var t = 0; t < arrTravellers.length; t++){  
			if(arrTravellers[t].id_customer_customer !== id_person)continue;  
			per = arrTravellers[t];  
			break;  
		}  
	}  
	  
	// Daten aus der DB verwenden  
	var newVal = "";  
  
	if(src === 'db'){  
		// neuen Wert bestimmen  
		for(var x = 0; x < arrOnlineBookingPersonData[id_person].length; x++){  
			if(parseInt(arrOnlineBookingPersonData[id_person][x].id_customer_customer,10) !== parseInt(id,10))continue;  
			var newVal = arrOnlineBookingPersonData[id_person][x][inp];  
			break;  
		}  
		  
		// Anzeige wechseln  
		$('togglePersonDataOff' + inp + id).show();  
		$('togglePersonDataOn' + inp + id).hide();  
  
		  
	// Daten der Person aus der Anfrage (Gast oder mitr. Person) verwenden  
	} else {  
		var newVal = per[inp];  
		// Anzeige wechseln  
		$('togglePersonDataOff' + inp + id).hide();  
		$('togglePersonDataOn' + inp + id).show();  
  
	}  
	  
	// Array aktualisieren  
	for(var w = 0; w < arrSearchResultSelectedPersondata[id_person].length; w++){  
		if(parseInt(arrSearchResultSelectedPersondata[id_person][w].id_customer_customer,10) !== parseInt(id,10))continue;  
		arrSearchResultSelectedPersondata[id_person][w][inp] = newVal;	  
		break;  
	}  
	$('onlineBookingSearchResult_' + inp + id).update(newVal);  
}  

Und nun das Merkwürdige. In der letzten for-Schleife möchte ich den neuen Wert newVal im Array arrSearchResultSelectedPersondata[id_person] speichern mit

arrSearchResultSelectedPersondata[id_person][w][inp] = newVal;

Der neue Wert newVal wird aber durch eben diesen Befehl auch in arrOnlineBookingPersonData[id_person] gespeichert. Und ich weiß einfach nicht warum.

Wer kann mir da weiterhelfen?

  1. Der neue Wert newVal wird aber durch eben diesen Befehl auch in arrOnlineBookingPersonData[id_person] gespeichert. Und ich weiß einfach nicht warum.

    Weil beide Arrays schlicht eine Referenz auf das gleiche Objekt enthalten.
    Egal über welchen Array, du modifizierst immer das gleiche Objekt.

    Wenn du das nicht willst, musst du das Objekt clonen, nicht einfach eine Referenz zuweisen.

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. Aha, mit Klonen bin ich bisher noch nicht in Berührung gekommen. Danke für den Tipp!

      Mit folgenden Zeilen funktioniert es jetzt wie gewünscht

      arrOnlineBookingPersonData[id_person] = ret;
      arrSearchResultSelectedPersondata[id_person] = Object.clone(ret);