功能略有误算

时间:2010-06-11 10:28:21

标签: javascript arrays

首先,我有一个数据库,用于保存我正在创建的游戏的地图数据。我页面上的脚本使用JSON从数据库中检索一定数量的数据并将其存储在数组中。

当检索数据时,它会通过一个函数找出在该特定区域中使用了多少个单独的图块。这是代码:

var xmlhttp = new XMLHttpRequest;
xmlhttp.onreadystatechange = function(){
    if(xmlhttp.readyState == 4){
        var map = JSON.parse(xmlhttp.responseText);
        var mapTiles = new Array;
        for(var count = 0; count < map.length; count ++){
            if(map[count]){
                if(map[count]['tile'] in mapTiles == false){
                    mapTiles.push(map[count]['tile']);
                }
            }
        }
        alert(mapTiles);
    }
}

每次脚本找到一个不在mapTiles数组中的图块编号时,都会将其添加到该图块中。

目前,该脚本正在获取1024条记录,其中除了一条记录外,其他所有记录都包含平铺值“1”,另一条记录包含平铺值“2”。这意味着当我提醒mapTiles数组时,它应该显示“1,2”,而是显示“1,1,2”。所以脚本中有一个小错误,但我找不到它。

1 个答案:

答案 0 :(得分:3)

in operator检查对象是否具有命名属性或在数组索引处包含元素。在您的情况下,检查始终为false,因为第一次没有元素,因此它返回false。当mapTiles包含1时,它处于第零位,因此检查返回false。检查2时,最后一个元素位于第一个位置,因此返回false。您需要遍历数组并检查元素的值,而不是使用in运算符。

 function contains( obj, aray )
 {
      for (var i = 0, len = aray.length, isIn = false; i < len && !isIn; ++i) {
          isIn = aray[i] === obj;
      }
      return isIn;
 }


 ...
 if(!contains(map[count]['tile'],mapFiles)){
     mapTiles.push(map[count]['tile']);
 }