将对象推入数组的Javascript会更改整个数组

Sha*_*awn 9 javascript arrays object

我正在使用特定的游戏制作框架,但我认为这个问题适用于javascript

我试图制作一个叙述剧本,以便玩家可以看到"兽人击中你".在他的屏幕底部.我想一次显示最后4条消息,并且可能允许玩家回顾日志中的30-50条消息.为此,我设置了对象和一个数组来将对象推入.

所以我最初设置了一些像这样的变量......

servermessage: {"color1":"yellow", "color2":"white", "message1":"", "message2":""},
servermessagelist: new Array(),
Run Code Online (Sandbox Code Playgroud)

当我通过操作servermessage.color1 ... .message1等多次使用此命令(下面)与事件调用的不同数据时...

servermessagelist.push(servermessage)
Run Code Online (Sandbox Code Playgroud)

它用整个数据的副本覆盖整个数组...任何想法为什么或我能做些什么呢.

因此,如果我按color1"RED"和message1"Rover"..数据是正确的,那么如果我按color1"黄色"和m​​essage1"Bus"数据是.color1的两个副本:"yellow".message1:"Bus"

nbr*_*oks 21

当你servermessage进入servermessagelist你真的(或多或少)推动对该对象的引用.因此,所做的任何更改都会servermessage反映在您引用它的任何位置.听起来你想要做的就是将对象的克隆推送到列表中.

声明一个函数如下:

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;
}
Run Code Online (Sandbox Code Playgroud)

然后每当你想将一条消息推入列表时:

servermessagelist.push( cloneMessage(servermessage) );
Run Code Online (Sandbox Code Playgroud)