Wenn Sie Objekte in ein Array verschieben, ändert sich das gesamte Array

7

Ich verwende ein spezifisches Framework für die Erstellung von Spielen, aber ich denke, die Frage bezieht sich auf JavaScript

Ich habe versucht, ein Erzählskript zu erstellen, damit der Spieler sehen kann: "Der Ork trifft dich." am unteren Rand seines Bildschirms. Ich wollte die letzten 4 Nachrichten auf einmal zeigen und möglicherweise dem Spieler erlauben, zurück zu schauen, um 30-50 Nachrichten in einem Protokoll zu sehen, wenn sie wollen. Um dies zu tun, richte ich ein Objekt und ein Array ein, um die Objekte hineinzuschieben.

Also habe ich anfänglich einige Variablen eingerichtet ...

%Vor%

und wenn ich diesen Befehl (unten) mehrfach mit verschiedenen Daten verwende, die von einem Event aufgerufen werden, indem ich servermessage.color1 ... .message1 etc ...

manipuliere %Vor%

es überschreibt das gesamte Array mit Kopien dieser Daten ... jede Idee, warum oder was ich dagegen tun kann.

Wenn ich also Farbe1 "ROT" und Meldung1 "Rover" drücke, sind die Daten korrekt, wenn ich drücke color1 "gelb" und message1 "Bus" die Daten sind zwei Kopien von .color1: "gelb" .message1: "Bus"

    
Shawn 26.06.2012, 23:07
quelle

4 Antworten

16

Wenn du servermessage in servermessagelist drückst, drückst du wirklich (mehr oder weniger) eine Referenz auf dieses Objekt. Änderungen, die Sie an servermessage vornehmen, werden also überall dort reflektiert, wo Sie einen Verweis darauf haben. Es klingt wie, was Sie tun möchten, ist ein Klon des Objekts in die Liste zu schieben.

Deklarieren Sie eine Funktion wie folgt:

%Vor%

Dann müssen Sie jedes Mal, wenn Sie eine Nachricht in die Liste schieben wollen, Folgendes tun:

%Vor%     
nbrooks 26.06.2012, 23:11
quelle
2

Wenn Sie das Objekt zum Array hinzufügen, ist es nur ein Verweis auf das Objekt, das hinzugefügt wird. Das Objekt wird nicht kopiert, indem es zum Array hinzugefügt wird. Wenn Sie später das Objekt ändern und es erneut zum Array hinzufügen, haben Sie nur ein Array mit mehreren Referenzen auf das gleiche Objekt.

Erstellen Sie ein neues Objekt für jede Hinzufügung zum Array:

%Vor%     
Guffa 26.06.2012 23:14
quelle
1

servermessagelist: new Array () leert das Array bei jeder Ausführung. Führen Sie diesen Code nur einmal aus, wenn Sie das Array ursprünglich initialisiert haben.

    
riku 26.06.2012 23:11
quelle
0

Ich hatte auch dasselbe Problem. Ich hatte ein komplexes Objekt gebissen, das ich in das Array geschoben hatte. Was ich getan habe; I Konvertiere ein JSON-Objekt als String mit JSON.stringify () und schiebe es in das Array.

Wenn es aus dem Array zurückkehrt, konvertiere ich einfach diesen String in JSON-Objekt mit JSON.parse ().

Das funktioniert gut für mich, obwohl es viel mehr runde Lösung ist. Post hier Wenn Sie alternative Möglichkeiten haben

    
Piusha 07.08.2015 04:15
quelle

Tags und Links