2010-06-11 43 views
0

首先,我有一個數據庫來保存我創建的遊戲的地圖數據。我的頁面上的腳本使用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」。所以腳本中有一個小錯誤,但我找不到它。

回答

3

in operator檢查對象是否具有指定的屬性或包含數組索引處的元素。在你的情況下,檢查總是錯誤的,因爲第一次,沒有元素,所以它返回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']); 
} 
+0

感謝您的好回答! +1 – Stanni 2010-06-11 11:06:49