检查数组是否有变化

时间:2015-08-18 20:23:46

标签: javascript arrays object html5-canvas compare

在Javascript / HTML5-canvas游戏中工作,我试图通过设置一个等于原始waterTilesCheck数组的数组waterTiles来完成填充区域后停止功能在函数的开头,然后在最后比较它们。如果对原始水阵进行了更改,我希望该功能再次运行,但是如果在运行该功能时没有任何变化,我希望它通过说waterComplete = true来停止运行。 waterTiles数组中的每个对象都有x,y,width,height和tag属性,但tag属性是唯一需要进行比较的属性。

function fillWater (modifier) {
    waterTilesCheck = waterTiles;
    for (var i = 0; i < waterTiles.length; i++) {
        //get tiles to the left, right, above and below of i
        var l = i - (worldDim.height + 1);
        var r = i + (worldDim.height + 1);
        var u = i + 1;
        var d = i - 1;
        //just a sample of some of the logic used to move water
        if (tiles[i].tag != "none"
            && u < tiles.length
            && waterTiles[i].tag == "water"
            && waterTiles[u].y >= worldDim.top * X * 2) {
            waterTiles[u].tag = "water";
            waterTiles[i].tag = "none";
        }
    };
    for (var i = 0; i < waterTiles.length; i++) {
        if (waterTiles[i].tag == "water") {
            worldWaterCount++;
        } else {
            waterTiles[i].tag = "none";
        }
    };
    waterCheck();
    console.log(waterComplete);
};

waterCheck是我试图比较数组的函数:

function waterCheck () {
    for (var i = 0; i < waterTiles.length; i++) {
        var check = Object.is(waterTiles[i].tag, waterTilesCheck[i].tag);
        if (!check) {
            waterComplete = false;
            return;
        }
    };
    waterComplete = true;
    return;
};

Object.is看起来像一个漂亮的技巧,但没有工作,只是比较waterTiles[i].tag == waterTilesCheck[i].tag似乎没有工作,这让我感到困惑。所以现在我陷入困境并接受建议......

完整代码:https://gist.github.com/TuckerFlynn/3d73d0d6d8e636743ff9

在浏览器中运行以查看游戏内容,水功能在500行左右

1 个答案:

答案 0 :(得分:0)

所以,你实际上并没有将waterTilesCheck设置为waterTiles的快照。您将其设置为指向同一个数组。因此,您对waterTiles所做的任何更改也会影响waterTilesCheck。 (如果你只是逐个复制元素,你将在对象级别遇到同样的问题 - 你需要在不可变元素(字符串,整数等)的级别进行复制)。试试这个:

var originalTags = [];
for (var i = 0; i < waterTiles.length; i++) {
  originalTags.push(waterTiles[i].tag);
  ...
}
waterCheck(originalTags);

并在水中检查:

function waterCheck(originalTags) {
  for (var i = 0; i < waterTiles.length; i++)
    if (waterTiles[i].tag !== originalTags[i]) {
      waterComplete = false;
      return;
    }
  waterComplete = true;
  return;
}