2012-06-26 9 views
7

を変更し、私は、フレームワークを作る特定のゲームを使用していますが、私は質問は、私は、プレイヤーが「オークがあなたを打つ見ることができるようにナレーションスクリプトを作成しようとしていたのjavascriptJavascriptが配列にオブジェクトをプッシュするには、アレイ全体

に適用されると思います"彼の画面の一番下にあります。私は一度に最後の4つのメッセージを表示したいと思っていました。これを行うために、私はオブジェクトを設定し、オブジェクトを押し込む配列を設定します。

だから私が最初にこのようないくつかの変数を設定...

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

とするとき、私は(下)このコマンドを使用して複数回servermessage.color1を操作することにより、イベントによって呼び出される様々なデータを持ちます...。メッセージ1など...

アレイ全体がそのデータのコピーで上書きされます。なぜか、私はそれについて何ができるのですか。

したがって、私がcolor1 "RED"とmessage1 "rover"を押した場合、データは正しいです。 color1 "yellow"とmessage1 "bus"をプッシュすると、データは.color1: "yellow"の2つのコピーになります。メッセージ1: "バス"

+0

「アレイの全体をそのデータのコピーで上書きする」とはどういう意味ですか?結果の配列を反復するために使用するコードを表示できますか? –

答えて

16

servermessageservermessagelistにプッシュすると、実際にはそのオブジェクトへの参照が多かれ少なかれプッシュされます。したがって、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; 
} 

その後、毎回あなたがリストにメッセージをプッシュするには、実行します。あなたは配列にオブジェクトを追加すると、それだけで参照

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

オブジェクトの配列を宣言することでこれを簡単に行うことができますか?私はそれをする方法を知らない。 – Shawn

+0

'servermessage'を押すたびにこのクローンを行う必要があります。変更したら、クローンを作成し、クローンをプッシュします。 – nbrooks

+0

最初のオブジェクトのプロパティを使用するたびに新しいオブジェクトを宣言し、値を 'null'または ''に設定することができます – nbrooks

1

servermessagelist:new Array()は実行されるたびに配列を空にします。もともと配列を初期化したときに初めてそのコードを実行してください。

+0

メッセージリストは私の最初の機能です。プッシュはwebsocketイベントで実行される更新機能にあります... – Shawn

+0

ああ、私の悪い、私はあなたのコード例からそれを得ていません。しかし、nbrooksのように、javascriptオブジェクトは常に参照として渡されるため、正しく動作しない理由があります。 – riku

2

です追加されたオブジェクトに追加します。オブジェクトは配列に追加することによってコピーされません。したがって、後でオブジェクトを変更して配列に再度追加すると、同じオブジェクトへの複数の参照を持つ配列が得られます。

は、アレイの各添加のための新しいオブジェクトを作成します。

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

は私も同じ問題がありました。私は配列にプッシュしている複雑なオブジェクトを少し持っていました。私がしたこと; JSONオブジェクトをJSON.stringify()を使用してStringとして変換し、配列にプッシュします。

配列から戻ってくるときは、JSON.parse()を使用してそのStringをJSONオブジェクトに変換します。

これは少しはっきりしていますが、これはうまくいきます。 ここに投稿する代替のオプションをお持ちの場合

関連する問題