0

マルチプレイヤー同期ダイスにnode.jsサーバーを使用していますが、参照または使用されていない変数の変更に関して奇妙な問題が発生しています...

    var origonalRolls = rolls;

    //identify epic fails
    var epicFails = [];
    for(var r = 0; r < rolls.length; r++)
        if(rolls[r] === 1)
            epicFails.push(r);

    console.log("TEST 1 :: " + JSON.stringify(rolls));
    console.log("TEST 2 :: " + JSON.stringify(origonalRolls));
    //remove epic fails and the corresponding heighest
    if(epicFails.length > 0){
        for(var i = epicFails.length-1; i >= 0; i--){
            rolls.splice(epicFails[i], 1);
            if(rolls[rolls.length-1] >= success)
                rolls.splice(rolls.length-1, 1);
        }
    }
    console.log("TEST 3 :: " + JSON.stringify(rolls));
    console.log("TEST 4 :: " + JSON.stringify(origonalRolls));

上記は、1である配列内の任意の要素を見つけて、rollsそれをに追加する必要がありepicFailsます。rolls次に、残りの最も重いロールからそれを削除する必要があります。(注、rolls数値でソートされています)

何らかの理由で、このコードセグメントの出力は次のようになります。

TEST 1 :: [1,1,2,3,3,6,7,7,9,9]
TEST 2 :: [1,1,2,3,3,6,7,7,9,9]
TEST 3 :: [2,3,3,6,7,7]
TEST 4 :: [2,3,3,6,7,7]

理由がわからないので、同じようrollsorigonalRolls開始して同じように終了します。使用しているのはrolls

この問題の助けや説明は大歓迎です、それは長い間私を悩ませてきました...

4

2 に答える 2

2

Javascriptでは、配列とオブジェクトは浅くコピーされます-つまり、別の配列(originalRolls)からコピーされた配列(rolls)はoriginalRollsへの参照にすぎません-完全に新しい配列ではなく、1つの値を変更すると他の。

別の配列に基づいてまったく新しい配列を作成するには、ディープコピー関数を実装する必要があります。こことネット上の他の場所の両方で、配列/オブジェクトのディープコピーの実装が多数あります。これは、クイックGoogleからのそれらの1つです。

于 2013-03-24T23:29:55.953 に答える
0

置換var origonalRolls = rolls;

var origonalRolls = [];
for (var i = 0, len = rolls.length; i < len; i++) {
    origonalRolls[i] = rolls[i];
}
于 2013-03-24T23:38:24.587 に答える