2010-06-11 6 views
0

Pour commencer, j'ai une base de données qui contient des données cartographiques pour un jeu que je crée. Un script sur ma page utilise JSON pour récupérer une certaine quantité de ces données de la base de données et les stocker dans un tableau. Lorsque les données sont récupérées, elles passent par une fonction qui détermine le nombre de tuiles individuelles utilisées dans cette zone particulière. Voici le code:Fonction faisant une légère erreur de calcul

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

Pour chaque fois que le script trouve un certain nombre de tuiles qui ne sont pas déjà dans le tableau, il ajoute de dalles à elle.

Actuellement, le script récupère 1024 enregistrements qui tous sauf un contiennent la valeur de tuile «1» dont l'autre contient la valeur de tuile «2». Cela signifie que lorsque j'alerte le tableau mapTiles, il devrait afficher "1, 2" mais afficher "1, 1, 2". Il y a donc une légère erreur dans le script mais je ne le trouve pas.

Répondre

3

Le in operator vérifie si l'objet possède la propriété nommée ou contient un élément dans l'index du tableau. Dans votre cas, la vérification est toujours fausse car la première fois, il n'y a pas d'éléments et retourne donc faux. Lorsque mapTiles contient 1, il est dans la position zéro et ainsi la vérification retourne false. Lorsque vous vérifiez 2, le dernier élément est dans la première position et retourne donc false. Vous devez parcourir le tableau et vérifier la valeur de l'élément, plutôt que d'utiliser l'opérateur 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

Merci pour la bonne réponse! +1 – Stanni