Frage

Ich möchte einen JavaScript Funktion, die eine Postleitzahl überprüft, indem geprüft wird, ob die Postleitzahl tatsächlich existiert. Hier ist eine Liste aller Postleitzahlen:

http://www.census.gov/tiger/tms/gazetteer /zips.txt (I über die zweite Spalte nur Pflege)


Das ist wirklich ein Kompressions Problem. Ich möchte dies für Spaß tun. OK, jetzt, dass aus dem Weg, hier ist eine Liste der Optimierungen über eine geraden hashtable, die ich denken kann, habe ich hinzufügen fühlen sich frei, etwas nicht zu denken:

  • Break zipcode in 2 Teile, ersten 2 Ziffern und letzten 3 Ziffern.
  • Erstellen Sie ein Riesen-if-else-Anweisung zuerst die ersten 2 Ziffern überprüft, dann Bereiche innerhalb der letzten 3 Stellen zu überprüfen.
  • Oder verdeckte die Reißverschlüsse in hex, und sehen, ob ich die gleiche Sache kleinere Gruppen tun können, verwenden.
  • Sie, ob im Bereich aller gültigen Postleitzahlen mehr gültig Postleitzahlen vs ungültigen Postleitzahlen sind. Schreiben Sie den obigen Code-Targeting die kleinere Gruppe.
  • Break den Hash in separate Dateien auf und laden sie über Ajax als Benutzertypen in der zipcode. Also vielleicht brechen in 2 Teile, zuerst für die ersten 2 Ziffern, die zweite für die letzten 3

Schließlich plane ich die JavaScript-Dateien mit einem anderen Programm zu erzeugen, nicht von Hand.

Edit: Leistung zählt hier. Ich möchte dies verwenden, wenn es nicht saugen. Performance der JavaScript Codeausführung + Downloadzeit.

Edit 2: JavaScript nur Lösungen bitte. Ich habe keinen Zugriff auf den Anwendungsserver, plus, dass dies in eine ganz andere Probleme machen würde =)

War es hilfreich?

Lösung

  

Ich möchte eine JavaScript-Funktion schreiben, die eine Postleitzahl bestätigt

Könnte mehr Mühe, als es wert ist, halten es aktualisiert, so dass zu keinem Zeitpunkt jemand real gültige Postleitzahl abgelehnt wird. Sie können auch einen externen Service versuchen, oder tun, was alle anderen nicht und akzeptieren nur jede 5-stellige Zahl!

  

Hier ist eine Liste der Optimierungen über eine geraden hashtable, die ich mich vorstellen kann

Es tut uns Leid das Potenzial Spaß zu verderben, aber Sie sind wahrscheinlich nicht viel besser tatsächliche Leistung gehen zu verwalten als Objekt von JavaScript gibt Ihnen, wenn sie als Hash-Tabelle verwendet. Objekt Mitglied Zugang ist eine der häufigsten Operationen in JS und werden von der Super-optimiert; Ihre eigenen Datenstrukturen bauen, ist unwahrscheinlich, dass es sogar zu schlagen, wenn sie von einem Computer wissenschaftlicher Sicht potenziell bessere Strukturen sind. Insbesondere alles ‚Array‘ mit geht nicht so gut funktioniert, wie Sie denken, weil Array tatsächlich als Objekt (Hash-Tabelle) selbst durchgeführt wird.

gesagt haben, dass ein möglicher Raum Kompressions-Tool, wenn Sie wissen müssen, um ‚gültig ist oder nicht‘ wäre ein 100000-Bit-Bit-Feld zu verwenden, in einen String verpackt. Zum Beispiel für einen Raum von nur 100 Postleitzahlen, wo Codes 032-043 ist ‚gültig‘:

var zipfield= '\x00\x00\x00\x00\xFF\x0F\x00\x00\x00\x00\x00\x00\x00';
function isvalid(zip) {
    if (!zip.match('[0-9]{3}'))
        return false;
    var z= parseInt(zip, 10);
    return !!( zipfield.charCodeAt(Math.floor(z/8)) & (1<<(z%8)) );
}

Jetzt müssen wir erarbeiten gerade die effizienteste Weg, um die bitfield, um das Skript zu erhalten. Die naive ‚\ x00' gefüllte Version oben ist ziemlich ineffizient. Herkömmliche Ansätze, dass die Verringerung würde zB. zu Base64-kodiert es:

var zipfield= atob('AAAAAP8PAAAAAAAAAA==');

Das würde erhalten die 100000 Fahnen bis 16.6kB. Leider atob ist Mozilla-only, so dass ein zusätzlicher base64 Decoder für anderen Browser erforderlich wäre, um. (Es ist nicht zu hart, aber es ist ein bisschen mehr Startzeit zu dekodieren.) Es könnte auch möglich sein, eine AJAX-Anforderung zu verwenden, um eine direkte Binärkette zu übertragen (codiert in ISO-8859-1 Text response). Das würde es sich an der 12.5kB.

Aber in Wirklichkeit wahrscheinlich etwas, auch die naive Version würde tun, solange Sie das Skript mit mod_deflate serviert, das viele dieser Redundanz komprimieren entfernt würde, und auch die Wiederholung von ‚\ x00‘ für alle großen Reichweiten von 'ungültig' Codes.

Andere Tipps

Sie könnten das Undenkbare tun und den Code als eine Zahl behandeln (denken Sie daran, dass es nicht wirklich eine Zahl ist). Konvertieren Sie Ihre Liste in eine Reihe von Bereichen, zum Beispiel:

zips = [10000, 10001, 10002, 10003, 23001, 23002, 23003, 36001]
// becomes
zips = [[10000,10003], [23001,23003], [36001,36001]]
// make sure to keep this sorted

dann zu testen:

myzip = 23002;
for (i = 0, l = zips.length; i < l; ++i) {
    if (myzip >= zips[i][0] && myzip <= zips[i][1]) {
        return true;
    }
}
return false;

Dies ist mit nur einer sehr naiven lineare Suche (O (n)). Wenn Sie die Liste sortiert gehalten und verwendet, um binäre Suche, könnten Sie erreichen O (log n).

Ich verwende Google Maps API zu prüfen, ob ein zipcode vorhanden ist.

Es ist genauer.

Angenommen, Sie die Reißverschlüsse in einem sortierten Array haben (scheint fair, wenn Sie die Erzeugung der Datenstruktur sind Controlling), ob eine einfache binäre Suche schnell genug ist.

So ... Sie machen das Client-seitige Validierung und wollen für die Dateigröße optimieren? Sie können sich wahrscheinlich nicht allgemeine Kompression verloren. Glücklicherweise unterstützen die meisten Browser gzip für Sie, so dass Sie so viel kostenlos nutzen können.

Wie wäre es eine einfache json codiert dict oder eine Liste mit den Postleitzahlen in sortierter Reihenfolge und machen Sie einen auf dem dict nachzuschlagen. es wird gut komprimieren, da sein eine vorhersehbare Folge, Import leicht, da es json, den Browser mit in-built-Parser, und Lookup wird wahrscheinlich auch sehr schnell sein, denn das ist ein Javascript primitiv ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top