JavaScriptの郵便番号検証関数の作成
-
03-07-2019 - |
質問
JavaScript を作成して、郵便番号を検証します。郵便番号は実際に存在します。すべての郵便番号のリストは次のとおりです。
http://www.census.gov/tiger/tms/gazetteer /zips.txt (2列目のみが重要です)
これは本当に圧縮の問題です。楽しみのためにこれをやりたいです。さて、これで邪魔になりません。ここに、考えられるストレートハッシュテーブルの最適化のリストを示します。考えていないことは何でも自由に追加してください。
- 郵便番号を最初の2桁と最後の3桁の2つの部分に分けます。
- 最初の2桁を最初にチェックし、次に最後の3桁の範囲をチェックする巨大なif-elseステートメントを作成します。
- または、ジッパーを16進数に変換し、より小さなグループを使用して同じことができるかどうかを確認します。
- すべての有効な郵便番号の範囲内で、より有効な郵便番号と無効な郵便番号があるかどうかを調べます。小さいグループをターゲットに上記のコードを書きます。
- ハッシュを別のファイルに分割し、ユーザーが郵便番号を入力するときにAjaxを介してそれらを読み込みます。そのため、最初の2桁が最初の2桁、最後の3桁が2つの部分に分かれる可能性があります。
最後に、手動ではなく、別のプログラムを使用してJavaScriptファイルを生成する予定です。
編集:ここではパフォーマンスが重要です。うまくいかないなら、私はこれを使いたいです。 JavaScriptコード実行のパフォーマンス+ダウンロード時間。
編集2:JavaScriptのみのソリューションをご覧ください。私はアプリケーションサーバーにアクセスできません。さらに、これにより他の問題になります=)
解決
郵便番号を検証するJavaScript関数を作成したい
価値以上の努力が必要な場合があります。更新された状態を維持し、誰かの本当の有効な郵便番号が拒否されることはありません。また、外部サービスを試すこともできますし、他の全員が行うことをして、5桁の数字を受け入れることもできます!
これは、私が考えることができる直線ハッシュテーブルの最適化のリストです
可能性のあるFunを台無しにしてしまいましたが、JavaScriptのObjectがハッシュテーブルとして使用した場合に得られる実際のパフォーマンスをはるかに上手く管理することはおそらくできないでしょう。オブジェクトメンバーアクセスは、JSで最も一般的な操作の1つであり、最適化されます。独自のデータ構造を構築しても、コンピューターサイエンスの観点から見ればより優れた構造である可能性はあります。特に、‘ Array’を使用するものArrayは実際にはオブジェクト(ハッシュテーブル)自体として実装されているため、思ったほどパフォーマンスが上がりません。
とはいえ、「有効かどうか」だけを知る必要がある場合の可能なスペース圧縮ツールは、文字列にパックされた100000ビットのビットフィールドを使用することです。たとえば、郵便番号100のみのスペースの場合、コード032-043は‘有効’:
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)) );
}
ここで、ビットフィールドをスクリプトに取得する最も効率的な方法を考え出す必要があります。上記の単純な '\ x00'で埋められたバージョンは、かなり非効率的です。それを減らすための従来のアプローチは、例えばbase64エンコードするには:
var zipfield= atob('AAAAAP8PAAAAAAAAAA==');
これにより、100000個のフラグが16.6kBになります。残念ながら、atobはMozillaのみであるため、他のブラウザーには追加のbase64デコーダーが必要になります。 (それほど難しくありませんが、デコードするのに少し時間がかかります。)AJAXリクエストを使用して、直接バイナリ文字列(ISO-8859-1テキストでエンコードされたresponseTextに転送)を使用することも可能です。それは12.5kBになります。
しかし、mod_deflateを使用してスクリプトを提供する限り、実際にはおそらく単純なバージョンでも何でも実行できます。mod_deflateは、その冗長性の多くを圧縮し、すべての長い範囲で '\ x00'の繰り返しを圧縮しますof&#8216; invalid&#8217;コード。
他のヒント
考えられないことをして、コードを数字として扱うことができます(実際には数字ではないことに注意してください)。リストを一連の範囲に変換します。例:
zips = [10000, 10001, 10002, 10003, 23001, 23002, 23003, 36001]
// becomes
zips = [[10000,10003], [23001,23003], [36001,36001]]
// make sure to keep this sorted
テストする:
myzip = 23002;
for (i = 0, l = zips.length; i < l; ++i) {
if (myzip >= zips[i][0] && myzip <= zips[i][1]) {
return true;
}
}
return false;
これは、非常に単純な線形検索(O(n))を使用しているだけです。リストをソートしたままバイナリ検索を使用すると、O(log n)を達成できます。
Google Maps API を使用して、郵便番号が存在するかどうかを確認します。
より正確です。
ソートされた配列にzipがあると仮定して(データ構造の生成を制御している場合は公平に思えます)、単純なバイナリ検索が十分に速いかどうかを確認してください。
それで...クライアント側の検証を行っており、ファイルサイズを最適化したいですか?おそらく一般的な圧縮に勝るものはありません。幸いなことに、ほとんどのブラウザーはgzipをサポートしているため、その多くを無料で使用できます。
郵便番号を並べ替えた単純なJSONコード化された辞書またはリストについてはどうでしょうか。辞書を調べてください。予測可能なシーケンスであるため、うまく圧縮され、jsonであるためブラウザに組み込まれたパーサーを使用して簡単にインポートできます。これはおそらくJavaScriptプリミティブであるため、ルックアップもおそらく非常に高速になります。