Question

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:

http://www.census.gov/tiger/tms/gazetteer /zips.txt (la 2ème colonne ne m'intéresse)

C’est vraiment un problème de compression. Je voudrais faire ça pour le plaisir. OK, maintenant que c'est hors de propos, voici une liste d'optimisations par rapport à une table de hachage directe à laquelle je peux penser, n'hésitez pas à ajouter ce que je n'ai pas pensé:

  • Découpez le code postal en 2 parties, les 2 premiers et les 3 derniers chiffres.
  • Faites une instruction if si else géante en vérifiant d'abord les 2 premiers chiffres, puis en vérifiant les plages comprises dans les 3 derniers chiffres.
  • Ou convertissez les zips en hexagone et voyez si je peux faire la même chose en utilisant des groupes plus petits.
  • Découvrez si, dans la plage de tous les codes postaux valides, il existe plus de codes postaux valides que de codes non valides. Écrivez le code ci-dessus en ciblant le plus petit groupe.
  • Divisez le hachage en fichiers séparés et chargez-les via Ajax en tant que types d'utilisateurs dans le code postal. Alors peut-être diviser en 2 parties, d'abord pour les 2 premiers chiffres, en second lieu pour les 3 dernières.

Enfin, je prévois de générer les fichiers JavaScript à l'aide d'un autre programme, pas à la main.

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

Éditer 2: Solutions JavaScript uniquement s'il vous plaît. Je n’ai pas accès au serveur d’applications, ce qui en ferait un tout autre problème =)

Était-ce utile?

La solution

  

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

Cela pourrait demander plus d’efforts qu’il ne vaut la peine de garder à jour de manière à ce que le code postal valable de quelqu'un soit rejeté à aucun moment. Vous pouvez également essayer un service externe ou faire comme tout le monde et n'accepter que les numéros à 5 chiffres!

  

voici une liste d’optimisations par rapport à une table de hachage directe à laquelle je peux penser

Désolé de gâcher le potentiel de plaisir, mais vous n'allez probablement pas gérer de meilleures performances réelles que celles que vous offre l'objet JavaScript lorsqu'elles sont utilisées comme hashtable. L’accès aux membres d’objets 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 l'emporte, même si ce sont des structures potentiellement meilleures du point de vue informatique. En particulier, tout ce qui utilise "Array" ne fonctionnera pas aussi bien que vous le pensez car Array est en réalité implémenté comme un objet (hashtable) lui-même.

Ceci étant dit, un outil de compression de l'espace possible si vous devez seulement savoir "valide ou non" serait d'utiliser un champ de bits de 100 000 bits, condensé dans une chaîne. Par exemple, pour un espace de 100 codes ZIP uniquement, 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)) );
}

Il ne reste plus qu'à trouver le moyen le plus efficace de transférer le bitfield au script. La version naïve '\ x00' remplie ci-dessus est assez inefficace. Les approches conventionnelles pour réduire ce serait par exemple. pour le coder en base64:

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

Cela ramènerait les 100 000 drapeaux à 16,6 Ko. Malheureusement, atob étant réservé à Mozilla, un autre décodeur base64 serait nécessaire pour les autres navigateurs. (Ce n'est pas trop difficile, mais le temps de démarrage est un peu plus long pour le décodage.) Il pourrait également être possible d'utiliser une demande AJAX pour transférer une chaîne binaire directe (codée en texte ISO-8859-1 vers responseText). Cela réduirait à 12,5 Ko.

Mais en réalité, tout, même la version naïve, ferait probablement aussi bien que vous serviez le script en utilisant mod_deflate, ce qui réduirait une grande partie de cette redondance, ainsi que la répétition de '\ x00' pour toutes les longues plages. des codes "non valides".

Autres conseils

Vous pouvez faire l'impensable et traiter le code comme un nombre (rappelez-vous qu'il ne s'agit pas d'un nombre). Convertissez votre liste en une série de plages, 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 pour 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;

il s’agit simplement d’une recherche linéaire très naïve (O (n)). Si vous gardiez la liste triée et utilisiez la recherche binaire, vous pourriez obtenir O (log n).

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

C'est plus précis.

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

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 supportent gzip pour vous, vous pouvez donc l'utiliser gratuitement.

Que diriez-vous d’un dict ou d’une liste codée json simple avec les codes postaux dans l’ordre trié et effectuez une recherche sur le dict. ça va bien compresser, 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 également, car c’est une primitive javascript.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top