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));

上面应该找到rolls数组中为 1 的任何元素,然后将其添加到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]

我不确定为什么rolls并以相同的方式origonalRolls开始并以相同的方式结束。我只使用rolls.

欢迎对这个问题提供任何帮助和/或解释,这已经困扰我很长时间了......

4

2 回答 2

2

在 Javascript 中,数组和对象只是浅拷贝——这意味着从另一个数组(originalRolls)复制的数组(rolls)只是对 originalRolls 的引用——它不是一个全新的数组,修改一个数组中的值会影响其他。

您将需要实现一个深拷贝函数来创建一个基于另一个数组的全新数组。在网络上和其他地方都有许多深度复制数组/对象的实现——这是来自快速谷歌的其中一个。

于 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 回答