Javascript Array, seltsames Phänomen
Rene
- javascript
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?
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
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);