2009-08-11 10 views
0

J'ai une liste de codes zip que j'ai besoin de rechercher en utilisant jQuery.Recherche rapide de codes zip avec jQuery

J'ai les codes postaux-dans un fichier CSV comme ceci:

 
2407;ELVERUM 
2425;TRYSIL 
2427;TRYSIL 
2446;ENGERDAL 
2448;ENGERDAL 

La liste est assez grand, plus de 4000 entrées, zip code et la ville correspondante.

Quel est le moyen le plus rapide de rechercher dans la liste du navigateur? JSON? Si c'est le cas, comment puis-je convertir la liste en JSON ou un autre format si c'est mieux?

 
{ 
    "2407": "ELVERUM", 
    "2425": "TRYSIL" 
} 

Quelqu'un peut-il me montrer le meilleur moyen de le faire?

Mise à jour Serait-il possible/plus rapide de rechercher le fichier CSV chargé avec juste Regex?

Update2 Je cherche une correspondance exacte, et il ne va chercher quand il a 4 chiffres.

Update3 Voici mon code:

$('#postnummer').keyup(function(e) { 
    if($(this).val().length == 4) { 
    // Code to search the JSON for an exact match.  
    } 
}); 

$.getJSON("data.json",function(data){ 
}); 

Quelqu'un peut-il me montrer en utilisant ce code?

Répondre

2

Ceci est une page Web qui convertira votre fichier CSV en JSON à partir d'une URL. Vous pouvez l'utiliser localement sur votre ordinateur. Utilise JQuery et les plug-ins CSV et JSON. Note: ce script est un hack rapide spécifique au CSV donné.

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
<script src="http://js-tables.googlecode.com/svn/trunk/jquery.csv.min.js"></script> 
<script src="http://jquery-json.googlecode.com/files/jquery.json-1.3.min.js"></script> 
<script> 
jQuery(function($){ 

$('#conv').click(function(){ 
    $.get($('#myurl').val(), function(data){ 
     var csvobj = {}; 
     var csvray = $.csv(';')(data); 
     $(csvray).each(function(){ 
      csvobj[this[0]] = this[1]; 
     }); 
     $('#jsondata').val("areacodes=" + $.toJSON(csvobj)); 
    }); 
}); 

}); 
</script> 
Url to CSV: <input type="text" id="myurl" value="tilbud5.csv" /> 
<input type="button" id="conv" value="convert url to json" /> 
<br/> 
<textarea id="jsondata" rows="1000" cols="100"></textarea> 

En utilisant les données JSON, ceci est juste un exemple:

$('#postnummer').keyup(function(e) { 
    if($(this).val().length == 4) { 
     alert(areacodes[$(this).val()]); 
    } 
}); 

$.getJSON("data.json?callback=?"); 
+0

Super, c'était exactement ce que je cherchais. Un problème cependant, quand je charge la page de test avec votre code, le navigateur se bloque pendant environ 5 secondes, tout en chargeant/analysant le fichier JSON. Toute solution à cela? c'est un peu critique, puisque personne ne veut un navigateur freezer;) –

+0

Placez areacodes = devant les données de json. Par exemple: areacodes = {"2407": "ELVEREM"}. Ensuite, utilisez . Ou vous pouvez utiliser $ .getJSON ("data.json? Callback =?"); – user120242

+0

Vous devrez également supprimer var areacodes = {}; si vous le faites de cette façon. – user120242

0

Pour les ensembles de données volumineux, l'analyse JSON serait lente. Je vous suggère d'utiliser un format simple personnalisé au lieu, comme celui que vous avez est très bien:

2407;ELVERUM 
2425;TRYSIL 

Ensuite, vous pouvez analyser comme:

var data = dataContent.split('\n').map(function(line){ return line.split(';'); }) 

Lorsque les données est maintenant un tableau de tableaux 2 éléments: le premier étant le code postal et le second le nom. Ensuite, pour effectuer une recherche, vous devez faire quelque chose comme:

var foundItems = data.filter(function(p){ return p[0].indexOf(query) != -1; }); 

Ce qui vous permet d'obtenir un tableau de résultats. Si vous êtes uniquement intéressé par des correspondances exactes, l'utilisation d'une carte fonctionnerait mieux. Dans ce cas, à la place de la première ligne, vous pouvez le faire pour construire la cartographie:

var map = {}; 
dataContent.split('\n').forEach(function(line){ 
    var p = line.split(';'); 
    map[p[0]] = p[1]; 
}); 
+1

Ne serait-ce (la fonction de la carte) soit aussi lent (sinon plus) que l'analyse syntaxique JSON lui-même? En outre, le problème avec les tableaux serait que chaque recherche est une complexité O (n). –

+0

Cela ne fonctionne pas. Le tableau foundItems est juste vide. Voici mon code: $ ('# postnummer'). Keyup (fonction (e) { \t if ($ (this) .val(). Longueur == 4) { \t \t var foundItems = data.filter (fonction (p) {return p [0] .indexOf ($ (this) .val()) == 0;}); \t \t console.log (foundItems); \t} }); var carte = {}; .ajax $ ({ url: "tilbud5.csv", cache: false, succès: function (dataContent) { data = dataContent.split ('\ n') carte (fonction (ligne) {return. ligne.split (';');}) } }); Des pensées? –

+0

Chetan - Vous avez raison, la boucle à travers les lignes de données est O (n), et donc l'analyse du JSON. Mais en pratique, split() est plusieurs fois plus rapide que eval() - la fonction utilisée pour analyser JSON, qui appelle essentiellement l'interpréteur Javascript. Une boucle dans un tableau pour trouver une correspondance est plus lente qu'une carte, mais si vous voulez faire une correspondance partielle, c'est ce que vous devez faire, à moins de créer un index. Mais on dirait que mofle veut juste une correspondance exacte, pour laquelle une carte suffira, ce qui était mon dernier exemple. – airportyh

2

à 4000 entrées, vous devez simplement analyser comme JSON en utilisant le formulaire que vous suggérez:

{ 
    "2407": "ELVERUM", 
    "2425": "TRYSIL" 
} 

Si vous envisagez de faire une recherche en cherchant la correspondance exacte d'un code postal, cela vous donnera également le temps de recherche le plus rapide. Si vous faites quelque chose où l'utilisateur tape "24" et vous devez trouver tous les codes postaux qui commencent par "24", alors vous aurez besoin de quelque chose d'un peu plus avancé.

Je ne suis pas sûr des mécanismes que jQuery fournit pour analyser JSON. La façon dont il est généralement fait, est d'utiliser eval:

var zips = eval("(" + data + ")"); 

Ou sur les navigateurs modernes, vous pouvez utiliser la bibliothèque JSON plus rapide et plus sûr.

var zips = JSON.parse(data); 
+0

Ok, merci, mais aucune idée comment je peux convertir le CSV en JSON? Comment puis-je effectuer une recherche à travers le JSON analysé? –

+0

Il est important de noter que vous devez convertir des données CSV-> JS. Si vous faites CSV-> JSON-> JS Data, vous devez réaliser que vous ajoutez du temps de traitement supplémentaire au serveur, de sorte que le client reçoive JSON, ce qui nécessite une charge de conversion minimale sur le client. Si vous souhaitez utiliser cette méthode, vous devez convertir le CSV en JSON côté serveur. Quelque chose comme ceci: http://tamlyn.org/2009/06/csv2json-convert-csv-to-json/. Sinon, il serait logique d'analyser le CSV directement. Vous pouvez utiliser l'un des plugins jQuery CSV. http://code.google.com/p/js-tables/wiki/CSV – user120242

+0

Donc, si vous voulez suivre cette route, la langue côté serveur utilisée sera nécessaire. Comme si c'était PHP, vous voudrez utiliser fgetcsv(), puis json_encode(). Ou si vous voulez le stocker en tant que fichier statique, vous pouvez utiliser le lien tamlyn.org ci-dessus et l'enregistrer comme le fichier json que vous voulez. – user120242

Questions connexes