Array-push-Problem in JS

Davicito

Erfahrenes Mitglied
Hallo liebe JQuery-Comunity,

nach langer Abstinens meinerseits, habe ich wieder ein kleines Problem, was ich selber nicht lösen konnte und auch durch Google nicht sorichtig Klarheit bekommen habe.
(Das Array-Handling in JavaScript finde ich echt miß, das nur mal am Rande).
Mein Problem ist das ich mehrere Datensätze (als assoziatives Array -> {} ) in ein nummeric Array -> [] pushen will (Zeile 17, im Code-Teil).
mein Problem ist nicht, das es nicht funktioniert....

das assoziative Array 'tempArrayOneDateRow' wird in Zeile fünf befüllt und in Zeile 15 mit jeweils einem anderen Datum befüllt, und anschließend in das nummeric
Array 'dataArray' hinzugefügt (Zeile 17).
In den nächsten Schleifendurchgänge wird quasi das selbe Array nochmal genommen aber das Datum ändert sich hier immer.

... sondern das das Datum immer das selbe ist (Ausgabe in Zeile 22 -> siehe Konsolenausgabe unten). Doch wenn ich mir in jedem Schleifendurchgang mittels console.log() in Zeile 16 das tempArrayOneDateRow ausgeben lasse, befor es durch die push-Methode in das numeric Array landet, steht da tatzächlich immer ein anderes Datum drin (Siehe Konsolenausgabe unten).
Könnte es vielleicht sein, das durch die push-Funktion die vorhergehenden Einträge, im multidimensionalem Array mit überschrieben werden?

Javascript:
var dataArray = [];    
[...]
var tempArrayOneDateRow = {};
$.each(tempArrayDateRange, function(key2, value2){

     if(key2 !== 'startDatum' && key2 !== 'endDatum')
                tempArrayOneDateRow[key2] = tempArrayDateRange[key2];
 
     if(cn === 1 && tempArrayDateRange['startDatum'] !== null && tempArrayDateRange['startDatum'] !== 'undefined'
                && tempArrayDateRange['endDatum'] != null && tempArrayDateRange['endDatum'] !== 'undefined'){
        
           var startDate = moment(tempArrayDateRange["startDatum"], "DD.MM.YYYY").locale('de');
           var endDate = moment(tempArrayDateRange["endDatum"], "DD.MM.YYYY").locale('de');
           var diffDays = endDate.diff(startDate, 'days')+1;
           if( diffDays > 1){
               for(var i=0; i<diffDays; i++){                    
                  tempArrayOneDateRow.Datum = startDate.add(i, 'd').format('DD.MM.YYYY');
                  console.log('tempArrayOneDateRow[Datum]: '+JSON.stringify(tempArrayOneDateRow));
                  dataArray.push(tempArrayOneDateRow);
               }
           }
      }
    [...]    
}
console.log('dataArray: '+JSON.stringify(dataArray));

Ausgaben:
Code:
Ausgabe des gesamten multi-Array dataArray
dataArray: [{"Name":"Rp","Vorname":"Rnd","PersonalNr":"","Status":"","K_ID":"17","KB_ID":"1","ST_ID":"4","Vertragsart":"ANÜ","Notiz":"","Datum":"20.09.2018"},
{"Name":"Rp","Vorname":"Rnd","PersonalNr":"","Status":"","K_ID":"17","KB_ID":"1","ST_ID":"4","Vertragsart":"ANÜ","Notiz":"","Datum":"20.09.2018"},
{"Name":"Rp","Vorname":"Rnd","PersonalNr":"","Status":"","K_ID":"17","KB_ID":"1","ST_ID":"4","Vertragsart":"ANÜ","Notiz":"","Datum":"20.09.2018"},
{"Name":"Rp","Vorname":"Rnd","PersonalNr":"","Status":"","K_ID":"17","KB_ID":"1","ST_ID":"4","Vertragsart":"ANÜ","Notiz":"","Datum":"20.09.2018"},
{"Name":"Rp","Vorname":"Rnd","PersonalNr":"","Status":"","K_ID":"17","KB_ID":"1","ST_ID":"4","Vertragsart":"ANÜ","Notiz":"","Datum":"20.09.2018"},

[...]

Ausgabe von tempArrayOneDateRow[Datum] in jedem Schleifendurchgang
tempArrayOneDateRow[Datum]: {"Name":"Rp","Vorname":"Rnd","PersonalNr":"","Status":"","K_ID":"17","KB_ID":"1","ST_ID":"4","Vertragsart":"ANÜ","Notiz":"","Datum":"10.09.2018"}
tempArrayOneDateRow[Datum]: {"Name":"Rp","Vorname":"Rnd","PersonalNr":"","Status":"","K_ID":"17","KB_ID":"1","ST_ID":"4","Vertragsart":"ANÜ","Notiz":"","Datum":"11.09.2018"}
tempArrayOneDateRow[Datum]: {"Name":"Rp","Vorname":"Rnd","PersonalNr":"","Status":"","K_ID":"17","KB_ID":"1","ST_ID":"4","Vertragsart":"ANÜ","Notiz":"","Datum":"12.09.2018"}
tempArrayOneDateRow[Datum]: {"Name":"Rp","Vorname":"Rnd","PersonalNr":"","Status":"","K_ID":"17","KB_ID":"1","ST_ID":"4","Vertragsart":"ANÜ","Notiz":"","Datum":"13.09.2018"}
tempArrayOneDateRow[Datum]: {"Name":"Rp","Vorname":"Rnd","PersonalNr":"","Status":"","K_ID":"17","KB_ID":"1","ST_ID":"4","Vertragsart":"ANÜ","Notiz":"","Datum":"14.09.2018"}
 
So ganz verstehe ich deinen Code nicht, vor allem, weil ich nicht finde, wie tempArrayDateRange gefüllt wird. Es könnte aber sein, dass das Problem analog zu einem anderen Thread vor kurzem ist:
Die Funktion push() erzeugt keinen Klon der Struktur tempArrayOneDateRow sondern trägt eine Referenz in das Array ein. Da tempArrayOneDateRow global ist, verweisen dann alle Referenzen in dataArray auf diese globale Variable und im finalen Array stehen dann die Werte, die zuletzt dort eingetragen wurden.
Lösung, indem Du tempArrayOneDateRow nicht global sondern in der inneren for-Schleife definiertst.
 
Zuletzt bearbeitet:
So ganz verstehe ich deinen Code nicht, vor allem, weil ich nicht finde, wie tempArrayDateRange gefüllt wird. Es könnte aber sein, dass das Problem analog zu einem anderen Thread vor kurzem ist:
Die Funktion push() erzeugt keinen Klon der Struktur tempArrayOneDateRow sondern trägt eine Referenz in das Array ein. Da tempArrayOneDateRow global ist, verweisen dann alle Referenzen in dataArray auf diese globale Variable und im finalen Array stehen dann die Werte, die zuletzt dort eingetragen wurden.
Lösung, indem Du tempArrayOneDateRow nicht global sondern in der inneren for-Schleife definiertst.
Vielen lieben Dank. Das war der richtige Gedankengang ;-)
Ich habe das tempArrayOneDateRow nicht lokal, in der For-Schleife, definieren können, da dieses Array in anderen IF-Zweigen auch befüllt wird.
Habe hier das selbe Problem auch nochmal nachlesen können, mit ähnlichen Lösungsansätzen.
https://stackoverflow.com/questions/6546748/a-problem-occur-when-push-a-object-into-a-array

Weiter habe ich gedacht, dass ich das tempArrayOneDateRow irgendwie mit einer Copy-Funktion in ein neues Array kopiere (so. als echte Kopie) und dann die Kopie mit der Push-Funktion in das numeric Array übergebe.
Da gibt es leider nur die slice()-Methode, welche aber wieder leider nicht auf assoziative Array anwendbar ist. So blieb mir nichts anderes übrig, als eine weitere Unterschleife einzubauen (Zeile 5-8, short code view von oben), die alle Einträge übernimmt (ich weiß, ich weiß.... das ist nicht die charmanteste Lösung. Ich hätte mir das auch leichter vorgestellt. Aber wie Eingangs schon erwähnt, ist das Array-Handling in JS ein echtes Abenteuer) und füge dann nur noch das Datumsfeld mit dem neuen Datum hinzu und pushe es dann ins multi Array 'dataArray'. s. Code.

Javascript:
[...]
if( diffDays > 1){
       for(var i=0; i<diffDays; i++){                  
           var t = {};
           $.each(tempArrayOneDateRow, function(key3, value3){
                 if(key3 !== 'Datum')
                      t[key3] = tempArrayOneDateRow[key3];
            });
            t["Datum"] = startDate.add(i, 'd').format('DD.MM.YYYY');
            dataArray.push(t);
       }
}
[...]
 
Zuletzt bearbeitet:
das ich das tempArrayOneDateRow irgendwie mit einer Copy-Funktion in ein neues Array kopiere (so. als echte Kopie) und dann die Kopie mit der Push-Funktion in das numeric Array übergebe.
Da müsste eigentlich die Funktion clone() von jQuery helfen.
 
Hi,

vielleicht hilft dir eine Kombination aus JSON.stringify und JSON.parse:

Javascript:
var arr = [{a: {b: 'a'}}, {c: 'd'}],
    arr2 = JSON.parse(JSON.stringify(arr));

arr2[0].a.b = 'e';
arr[0].a.b === arr2[0].a.b; // => false

// dataArray.push(JSON.parse(JSON.stringify(tempArrayOneDateRow)));
Sollte funktionieren, solange keine Ringreferenzen enthalten sind.

Ciao
Quaese
 
Zuletzt bearbeitet:
Zurück