11

特定のゲーム作成フレームワークを使用していますが、質問はjavascriptに当てはまると思います

プレイヤーが「オークがあなたに当たった」とわかるように、ナレーションスクリプトを作成しようとしていました。彼の画面の下部にあります。一度に最後の4つのメッセージを表示し、必要に応じてプレーヤーがログに30〜50のメッセージを表示できるようにしたかったのです。これを行うために、オブジェクトとオブジェクトをプッシュする配列を設定します。

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

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

また、servermessage.color1 ... .message1などを操作してイベントによって呼び出されたさまざまなデータでこのコマンド(以下)を複数回使用すると、

servermessagelist.push(servermessage)

配列全体をそのデータのコピーで上書きします...理由や私がそれについて何ができるかについての考え。

したがって、color1"RED"とmessage1"Rover"をプッシュすると、データは正しくなります。color1"yellow"とmessage1" Bus"をプッシュすると、データは.color1: "yellow" .message1:"Bus"の2つのコピーになります。

4

8 に答える 8

25

あなたが押し込むとき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) );
于 2012-06-26T23:11:31.880 に答える
3

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

配列に追加するたびに新しいオブジェクトを作成します。

servermessage = {"color1":"yellow", "color2":"white", "message1":"", "message2":""};
servermessagelist.push(servermessage);
servermessage = {"color1":"green", "color2":"red", "message1":"", "message2":"nice work"};
servermessagelist.push(servermessage);
于 2012-06-26T23:14:27.123 に答える
3

オブジェクトを配列にプッシュする前に、オブジェクトをディープコピーする方法は2つあります。1.オブジェクトメソッドで新しいオブジェクトを作成し、それをプッシュします。

servermessagelist = []; 
servermessagelist.push(Object.assign({}, servermessage));
  1. JSON stringigyメソッドでオブジェクトの新しい参照を作成し、parseメソッドでプッシュします。

    servermessagelist = []; servermessagelist.push(JSON.parse(JSON.stringify(servermessage));

このメソッドは、ネストされたオブジェクトに役立ちます。

于 2019-08-02T09:30:05.580 に答える
1

servermessagelist:new Array()は、実行されるたびに配列を空にします。アレイを最初に初期化するときに、そのコードを1回だけ実行します。

于 2012-06-26T23:11:09.440 に答える
1

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

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

これは私にとっては問題なく機能していますが、もう少し丸い解決策です。代替オプションがある場合は、ここに投稿してください

于 2015-08-07T04:15:25.197 に答える
1

これを行うJSONの方法がまだ提案されていない理由はわかりません。最初にオブジェクトを文字列化し、次にそれを再度解析してオブジェクトのコピーを取得できます。

let uniqueArr = [];
let referencesArr = [];
let obj = {a: 1, b:2};

uniqueArr.push(JSON.parse(JSON.stringify(obj)));
referencesArr.push(obj);

obj.a = 3;
obj.c = 5;
uniqueArr.push(JSON.parse(JSON.stringify(obj)));
referencesArr.push(obj);

//You can see the differences in the console logs
console.log(uniqueArr);
console.log(referencesArr);

于 2018-08-02T16:58:27.660 に答える
1

このソリューションは、ネストされたキーを含むオブジェクトでも機能します。

プッシュする前に、objを次のように文字列化してください

JSON.stringify(obj)

そして、あなたが使用しているとき、

JSON.parse(obj);
于 2019-01-19T14:16:42.627 に答える
0

上記で何度も述べたように、これを行う最も簡単な方法は、文字列にしてJSONオブジェクトに変換することです。

this.<JSONObjectArray>.push(JSON.parse(JSON.stringify(<JSONObject>)));

チャームのように機能します。

于 2020-02-22T19:47:05.880 に答える