2009-03-05 8 views
1

Je voudrais écrire une fonction JavaScript qui valide un code postal, en vérifiant si le code postal existe réellement. Voici une liste de tous les codes postaux:Ecriture d'une fonction de validation de code postal JavaScript

http://www.census.gov/tiger/tms/gazetteer/zips.txt (Je cherche uniquement à la 2e colonne)


C'est vraiment un problème de compression. Je voudrais faire ça pour m'amuser. OK, maintenant c'est de la route, voici une liste des optimisations sur une table de hachage droite que je peux penser, vous pouvez ajouter tout ce que je ne l'ai pas pensé:

  • code postal Pause en 2 parties, 2 premiers chiffres et les 3 derniers chiffres.
  • Effectuez une instruction if-else géante en vérifiant d'abord les 2 premiers chiffres, puis en vérifiant les plages dans les 3 derniers chiffres.
  • Ou, inversez les zips en hexadécimal, et voyez si je peux faire la même chose en utilisant des groupes plus petits.
  • Découvrez si dans l'étendue de tous les codes postaux valables il y a plus de codes postaux valables par rapport à des codes postaux invalides. Écrivez le code ci-dessus ciblant le plus petit groupe.
  • Décomposez le hachage en fichiers séparés et chargez-les via Ajax lorsque l'utilisateur saisit le code postal. Alors peut-être diviser en 2 parties, d'abord pour les 2 premiers chiffres, deuxième pour le dernier 3.

Enfin, je prévois de générer les fichiers JavaScript en utilisant un autre programme, pas à la main.

Édition: la performance compte ici. Je veux l'utiliser, si ça ne craint pas. Performance de l'exécution du code JavaScript + temps de téléchargement.

Édition 2: Solutions uniquement JavaScript s'il vous plaît. Je n'ai pas accès au serveur d'application, plus, cela ferait un tout autre problème =)

+0

Vous avez une idée bizarre de "fun" –

+0

Parce que ceux d'entre nous qui ne veulent pas vous donner notre code postal ne vont pas entrer quelque chose comme, "12345" ... qui est valide (Schenectady, NY).: P – Thanatos

Répondre

2

Je voudrais écrire une fonction JavaScript qui valide un code postal

Peut-être plus d'efforts que cela vaut la peine, la tenue à jour de sorte que sans point quelqu'un est vrai code postal valide est rejeté. Vous pouvez également essayer un service externe, ou faire ce que tout le monde fait et accepter tout numéro à 5 chiffres!

Voici une liste des optimisations sur une table de hachage droite que je peux penser

Désolé de gâcher le potentiel Fun, mais vous allez probablement pas gérer beaucoup mieux les performances réelles que l'objet de JavaScript vous donne lorsqu'il est utilisé comme hashtable. L'accès des membres d'objet est l'une des opérations les plus courantes dans JS et sera super-optimisé; Il est peu probable que la construction de vos propres structures de données le batte même si elles sont potentiellement de meilleures structures du point de vue de l'informatique. En particulier, tout ce qui utilise 'Array' ne fonctionnera pas aussi bien que vous le pensez car Array est réellement implémenté en tant qu'Objet (hashtable) lui-même. Cela dit, un outil de compression d'espace possible si vous avez seulement besoin de savoir 'valide ou non' serait d'utiliser un champ de bits de 100000 bits, empaqueté dans une chaîne. Par exemple, pour un espace de seulement 100 codes postaux, où les codes 032-043 sont « valides »:

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

Maintenant, nous avons juste besoin de travailler sur la façon la plus efficace pour obtenir le bitfield au script. La version naïve '\ x00' remplie est plutôt inefficace. Les approches conventionnelles pour réduire cela seraient par exemple. encoder en base64:

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

Cela ferait passer les 100 000 drapeaux à 16,6 Ko. Malheureusement, atob est uniquement Mozilla, donc un décodeur base64 supplémentaire serait nécessaire pour les autres navigateurs. (Ce n'est pas trop difficile, mais c'est un peu plus de temps de décodage.) Il est également possible d'utiliser une requête AJAX pour transférer une chaîne binaire directe (encodée en texte ISO-8859-1 dans responseText). Cela le ramènerait à 12.5kB. Mais en réalité, probablement n'importe quoi, même la version naïve, ferait tout le temps que vous utilisiez le script en utilisant mod_deflate, ce qui compresserait une grande partie de cette redondance, et aussi la répétition de '\ x00' pour tout le long gammes de codes 'invalides'.

+0

Oui ne violez pas la première règle de la programmation:...! ne pas réinventer la roue –

+0

i comme cette solution est la meilleure parce que c'est très intelligent, rapide et amusant. – mkoryak

0

En supposant que vous avez les zips dans un tableau trié (semble juste si vous contrôlez la génération de la structure de données), voyez si une simple recherche binaire est assez rapide.

+0

c'est assez rapide, mais le code JS sera énorme, ce qui sera mauvais. Je n'ai pas mentionné ceci, mais c'est une condition, ouais =) – mkoryak

+0

Si la taille est un souci, allumez gzipping et caching; C'est une manière transparente de réduire le temps de téléchargement sans obscurcir votre logique. –

4

Vous pourriez faire l'impensable et traiter le code comme un nombre (rappelez-vous qu'il ne s'agit pas réellement d'un nombre). Transformez votre liste en une série de gammes, par exemple:

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

puis à tester:

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

c'est juste en utilisant une recherche linéaire très naïve (O (n)). Si vous avez trié la liste et utilisé la recherche binaire, vous pouvez obtenir O (log n).

+0

+1 pour donner de grandes spécifications O –

+0

quand vous dites [36001-36001] vous ne voulez pas vraiment dire soustraction juste. m'a jeté une boucle pour une seconde – mkoryak

+0

Je pense que ce sont des fautes de frappe. Je suis sûr qu'il voulait y mettre des virgules, pas des tirets. –

1

J'utilise Google Maps API pour vérifier si un code postal existe.

C'est plus précis.

+0

Oui, la liste census.gov est très obsolète – Miles

+0

merci, je vais y jeter un coup d'oeil ... peut-être que je ne réinvente pas la roue sorte de façon – mkoryak

+0

pouvez-vous me pointer vers l'API qui fait cela, je regardai, et je ne peux pas voir quoi que ce soit pour tout de suite – mkoryak

0

Alors ... Vous effectuez une validation côté client et souhaitez optimiser la taille du fichier? vous ne pouvez probablement pas battre la compression générale. Heureusement, la plupart des navigateurs prennent en charge gzip pour vous, vous pouvez donc en utiliser autant gratuitement.

Que diriez-vous d'un dict simple json codé ou une liste avec les codes postaux dans l'ordre trié et faire une recherche sur la dict. ça compressera bien, puisque c'est une séquence prévisible, importez facilement puisque c'est json, en utilisant l'analyseur intégré aux navigateurs, et la recherche sera probablement très rapide aussi, puisqu'il s'agit d'une primitive javascript.

1

Votre liste de codes postaux est obsolète. Ne dérangez pas les codes postaux de "validation" de 5 chiffres de toute façon, ils sont obsolètes comme expliqué à http://semaphorecorp.com/cgi/zip5.html

La validation correcte des adresses et codes ZIP + 4 est faite avec le logiciel CASS contre les bases de données USPS.

Questions connexes