1

郵便番号が実際に存在するかどうかをチェックして、郵便番号を検証するJavaScript関数を書きたいと思います。すべての郵便番号のリストは次のとおりです。

http://www.census.gov/tiger/tms/gazetteer/zips.txt (2列目だけ気になる)


これは実際には圧縮の問題です。楽しくやっていきたいと思います。わかりました、それは邪魔になりません。これは、私が考えることができるストレートハッシュテーブルに対する最適化のリストです。私が考えていないものを自由に追加してください:

  • 郵便番号を最初の 2 桁と最後の 3 桁の 2 つの部分に分割します。
  • 最初に最初の 2 桁をチェックし、次に最後の 3 桁内の範囲をチェックする巨大な if-else ステートメントを作成します。
  • または、ジッパーを 16 進数に変換し、小さなグループを使用して同じことができるかどうかを確認します。
  • すべての有効な郵便番号の範囲内に、有効な郵便番号と無効な郵便番号が存在するかどうかを調べます。小規模なグループを対象とする上記のコードを記述します。
  • ハッシュを個別のファイルに分割し、郵便番号のユーザー タイプとして Ajax 経由で読み込みます。最初は最初の 2 桁、2 番目は最後の 3 桁です。

最後に、手動ではなく、別のプログラムを使用して JavaScript ファイルを生成する予定です。

編集:ここではパフォーマンスが重要です。ダメならこれを使いたい。JavaScript コード実行のパフォーマンス + ダウンロード時間。

編集 2: JavaScript のみのソリューションをお願いします。私はアプリケーションサーバーにアクセスできません。さらに、これはまったく別の問題になります =)

4

6 に答える 6

4

考えられないことをして、コードを数値として扱うことができます (実際には数値ではないことに注意してください)。リストを一連の範囲に変換します。次に例を示します。

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) を達成できます。

于 2009-03-05T01:56:33.617 に答える
2

郵便番号を検証する JavaScript 関数を書きたい

誰かの実際の有効な郵便番号が拒否されることがないように、更新を維持することは、価値があるよりも多くの労力を要する可能性があります。また、外部サービスを試すこともできますし、他の人がしていることを実行して、5 桁の番号を受け入れることもできます!

これは、私が考えることができるストレートハッシュテーブルに対する最適化のリストです

潜在的な楽しみを台無しにして申し訳ありませんが、JavaScript のオブジェクトをハッシュテーブルとして使用した場合よりもはるかに優れた実際のパフォーマンスを管理することはおそらくないでしょう。オブジェクト メンバー アクセスは、JS で最も一般的な操作の 1 つであり、非常に最適化されます。独自のデータ構造を構築することは、コンピューター サイエンスの観点からはより優れた構造である可能性があるとしても、勝てそうにありません。特に、「配列」を使用するものは、実際にはオブジェクト (ハッシュテーブル) 自体として実装されているため、思ったほどうまく機能しません。

そうは言っても、「有効かどうか」だけを知る必要がある場合に可能なスペース圧縮ツールは、文字列にパックされた 100000 ビットのビットフィールドを使用することです。たとえば、100 の ZIP コードのみのスペースの場合、コード 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 を使用してスクリプトを提供する限り、単純なバージョンであっても、その冗長性の多くを圧縮し、「無効な」のすべての長い範囲に対して「\x00」の繰り返しを圧縮する限り、おそらく何でもできます。 'コード。

于 2009-03-05T02:21:36.520 に答える
1

Google Maps APIを使用して、郵便番号が存在するかどうかを確認します。

より正確です。

于 2009-03-05T01:59:06.637 に答える
0

ソートされた配列にzipがあると仮定して(データ構造の生成を制御している場合は公平に思えます)、単純なバイナリ検索が十分に高速かどうかを確認してください。

于 2009-03-05T01:56:02.650 に答える
0

これは役に立つかもしれません:

PHP 郵便番号の範囲と距離の計算

郵便番号のリストと同様。

于 2009-03-05T02:00:08.990 に答える