2009-08-11 19 views
0

Ich habe eine Liste von Postleitzahlen, die ich mit jQuery suchen muss.Suche Postleitzahlen schnell mit jQuery

Ich habe die Zip-Codes in einer CSV-Datei wie folgt:

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

Die Liste ist ziemlich groß, über 4000 Einträge, Zip-Code und die entsprechende Stadt.

Was ist der schnellste Weg, um durch die Liste im Browser zu suchen? JSON? Wenn dies der Fall ist, wie kann ich die Liste in JSON oder ein anderes Format umwandeln, wenn es besser ist?

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

Kann mir jemand den einfachsten Weg zeigen, dies zu tun?

Aktualisieren Wäre es möglich/schneller, die geladene CSV-Datei nur mit Regex zu durchsuchen?

Update2 Ich bin auf der Suche nach einer exakten Übereinstimmung, und es ist nur die Suche gehen, wenn es 4 Zahlen aufweist.

Update3 Hier ist mein Code:

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

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

Kann mir jemand zeigen, mit diesem Code?

Antwort

2

Dies ist eine Webseite, die Ihre CSV von einer URL in JSON konvertiert. Sie können es lokal auf Ihrem Computer verwenden. Verwendet JQuery und die CSV und Plug-Ins. Hinweis: Dieses Skript ist ein kurzer Hack, der für die angegebene CSV-Datei spezifisch ist.

<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> 

Mit den JSON-Daten, das ist nur ein Beispiel:

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

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

Großartig, das war genau das, wonach ich gesucht habe. Ein Problem jedoch, wenn ich die Testseite mit Ihrem Code lade, blockiert der Browser für ungefähr 5 Sekunden, während die JSON-Datei geladen/geparst wird. Irgendeine Lösung dafür? es ist irgendwie kritisch, da niemand einen freeezing Browser wünscht;) –

+0

Setzen Sie Bereichscodes = vor den json Daten. ZB: Ortskennzahlen = {"2407": "ELVEREM"}. Verwenden Sie dann . Oder Sie können $ .getJSON ("data.json? Callback =?"); – user120242

+0

Sie möchten auch var areasecodes = {}; wenn du es so machst. – user120242

0

Für große Datenmengen würde JSON-Analyse langsam sein. Ich schlage vor, Sie ein einfaches stattdessen benutzerdefiniertes Format verwenden, wie diejenige, die Sie haben, ist in Ordnung:

2407;ELVERUM 
2425;TRYSIL 

Dann können Sie analysieren, wie:

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

Wo Daten sind nun eine Reihe von 2-Element-Arrays: erstens die Postleitzahl und zweitens der Name. Um dann zu suchen, würden Sie etwas wie tun:

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

Welcher bekommt Sie eine Reihe von Übereinstimmungen. Wenn Sie nur an genauen Übereinstimmungen interessiert sind, würde die Verwendung einer Karte besser funktionieren. In diesem Fall anstelle der ersten Zeile, könnten Sie dies tun, um die Zuordnung zu bauen:

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

Wäre das nicht (die Kartenfunktion) sein als langsam (wenn nicht mehr) als JSON Parsen selbst? Das Problem mit Arrays wäre auch, dass jede Suche O (n) -Komplexität ist. –

+0

Es funktioniert nicht. Das Array foundItems ist einfach leer. Hier ist mein Code: $ ('# postnummer') keyup (Funktion (e) { \t if ($ (this) .val(). Länge == 4) { \t \t var foundItems = data.filter (Funktion (p) {return p [0] .indexOf ($ (this) .val()) == 0;}); \t \t console.log (foundItems); \t} }); var map = {}; $ Schnipsel ({ url: "tilbud5.csv", Cache: false, Erfolg: Funktion (Dateninhalt) { data = dataContent.split ('\ n') map (function (Linie) {return. line.split (';');}) } }); Irgendwelche Gedanken? –

+0

Chetan - Sie haben Recht, Schleifen durch die Datenzeilen ist O (n), und so ist das JSON zu analysieren. Aber in der Praxis ist split() um ein Vielfaches schneller als eval() - die Funktion, die verwendet wird, um JSON zu analysieren, was im Wesentlichen den Javascript-Interpreter aufruft. Das Durchlaufen eines Arrays, um eine Übereinstimmung zu finden, ist langsamer als eine Map. Wenn Sie jedoch einen Teilabgleich durchführen möchten, müssen Sie einen Index erstellen. Aber es sieht so aus, als ob mofle nur eine exakte Übereinstimmung wünscht, für die eine Karte ausreicht, was mein letztes Beispiel war. – airportyh

2

bei 4.000 Einträge, sollten Sie es einfach als JSON parsen das Formular Sie vorgeschlagen:

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

Wenn Sie nach der genauen Übereinstimmung einer Postleitzahl suchen, erhalten Sie die schnellste Suchzeit. Wenn Sie etwas tun, bei dem der Benutzer "24" eingibt und Sie alle Postleitzahlen suchen müssen, die mit "24" beginnen, benötigen Sie etwas fortgeschritteneres.

Ich bin nicht sicher, welche Mechanismen jQuery für die Analyse von JSON bietet. So wie es normalerweise getan wird, ist eval verwenden:

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

Oder auf modernen Browsern können Sie die schneller und sicherer JSON-Bibliothek verwenden.

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

Ok, danke, aber keine Idee, wie ich die CSV in JSON konvertieren kann? Wie kann ich durch den geparsten JSON suchen? –

+0

Es muss beachtet werden, dass Sie CSV-> JS Daten konvertieren müssen. Wenn Sie CSV-> JSON-> JS Data ausführen, sollten Sie feststellen, dass Sie dem Server zusätzliche Verarbeitungszeit hinzufügen, sodass der Client JSON erhält, was einen minimalen Konvertierungsaufwand für den Client erfordert. Wenn Sie diese Methode verwenden möchten, sollten Sie die CSV-Datei auf der Serverseite in JSON konvertieren. Etwas wie dieses: http://tamlyn.org/2009/06/csv2json-convert-csv-to-json/. Sonst wäre es nur sinnvoll, die CSV direkt zu parsen. Sie können eines der jQuery CSV-Plugins verwenden. http://code.google.com/p/js-tables/wiki/CSV – user120242

+0

Also, wenn Sie diese Route gehen wollen, wird die serverseitige Sprache benötigt. Wie wenn es PHP ist, möchten Sie fgetcsv() und dann json_encode() verwenden. Oder wenn Sie es als statische Datei speichern möchten, können Sie den obigen Link tamlyn.org verwenden und als gewünschte json-Datei speichern. – user120242