首先,我有一个数据库,用于保存我正在创建的游戏的地图数据。我页面上的脚本使用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”。所以脚本中有一个小错误,但我找不到它。
答案 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']);
}