2012-06-26 6 views
7

estoy usando un juego específico marco de toma pero creo que la pregunta se aplica a javascriptJavascript introducir objetos en el conjunto cambia toda gama

yo estaba tratando de hacer un script narración por lo que el jugador puede ver "El orco le golpea " en la parte inferior de su pantalla. Quería mostrar los últimos 4 mensajes a la vez y posiblemente permitir que el jugador mire hacia atrás para ver de 30 a 50 mensajes en un registro si así lo desean. Para hacer esto configuro y objeto y una matriz para insertar los objetos.

Así que establecieron algunas variables como éste inicialmente ...

servermessage: {"color1":"yellow", "color2":"white", "message1":"", "message2":""}, 
servermessagelist: new Array(), 

y cuando se utiliza este comando (abajo) varias veces con diferentes datos de llamadas por un evento mediante la manipulación de servermessage.color1 .... mensaje1 etc ...

servermessagelist.push(servermessage) 

sobrescribe toda la matriz con las copias de esos datos ... alguna idea de por qué o qué puedo hacer al respecto.

Así que si presiono color1 "ROJO" y mensaje1 "Rover" ... los datos son correctos, si presiono color1 "amarillo" y el mensaje1 "Bus" los datos son dos copias de .color1: "amarillo". message1: "Bus"

+0

¿Qué quiere decir "sobrescribe la matriz completa con copias de esos datos"? ¿Puedes mostrar el código que usas para iterar la matriz resultante? –

Respuesta

16

Al presionar servermessage en servermessagelist, en realidad está (más o menos) presionando una referencia a ese objeto. Por lo tanto, cualquier cambio realizado en servermessage se refleja en todos los lugares donde tenga una referencia. Parece que lo que quieres hacer es insertar un clon del objeto en la lista.

declarar una función de la siguiente manera:

function cloneMessage(servermessage) { 
    var clone ={}; 
    for(var key in servermessage){ 
     if(servermessage.hasOwnProperty(key)) //ensure not adding inherited props 
      clone[key]=servermessage[key]; 
    } 
    return clone; 
} 

Entonces cada vez que quiere empujar un mensaje en la lista de tareas:

servermessagelist.push(cloneMessage(servermessage)); 
+0

¿Hay alguna forma más fácil de hacerlo al declarar una matriz de objetos? No sé cómo hacer eso. – Shawn

+0

Tendría que hacer esta clonación cada vez que vaya a presionar 'servermessage'. Una vez que lo cambie, clonelo y luego presione su clon. – nbrooks

+0

Bueno, puede declarar un nuevo objeto cada vez utilizando las propiedades del primer objeto y establecer los valores para que sean 'nulos' o '' – nbrooks

1

servermessagelist: new Array() vacía la matriz cada vez que se ejecuta. Solo ejecute ese código una vez cuando inicialice originalmente la matriz.

+0

lista de mensajes está en mi función inicial, la inserción está en una función de actualización que se ejecuta en un evento de conexión web ... – Shawn

+0

Ah, mi mal, no lo obtuve en el ejemplo del código.Pero es como dijo nbrooks, en los objetos javascript siempre se pasan como referencia y esa es la razón por la que no está funcionando correctamente. – riku

2

Cuando se agrega el objeto a la matriz, que es sólo una referencia al objeto que se agrega. El objeto no se copia agregándolo a la matriz. Entonces, cuando más tarde cambia el objeto y lo agrega a la matriz nuevamente, solo tiene una matriz con varias referencias al mismo objeto.

Crear un nuevo objeto para cada adición a la matriz:

servermessage = {"color1":"yellow", "color2":"white", "message1":"", "message2":""}; 
servermessagelist.push(servermessage); 
servermessage = {"color1":"green", "color2":"red", "message1":"", "message2":"nice work"}; 
servermessagelist.push(servermessage); 
0

También tuve misma edición. Había mordido un objeto complejo que estaba presionando en la matriz. Lo que hice; Convierto el objeto JSON como cadena usando JSON.stringify() y presiono en la matriz.

Cuando está volviendo de la matriz, simplemente convierto esa cadena al objeto JSON utilizando JSON.parse().

Esto está funcionando bien para mí, aunque es una solución mucho más redonda. Publique aquí Si tienen opciones alternativas

Cuestiones relacionadas