2009-03-05 78 views
1

我想編寫一個驗證郵政編碼的JavaScript函數,通過檢查郵政編碼是否確實存在。這裏是所有郵政編碼的列表:編寫JavaScript郵政編碼驗證功能

http://www.census.gov/tiger/tms/gazetteer/zips.txt(我只關心第2列)


這是一個真正的壓縮問題。我想這樣做是爲了好玩。好了,現在這不礙事,這裏是優化過的直線哈希表,我能想到的,隨意添加任何東西我都沒有想到的列表:

  • 歇郵政編碼分爲兩個部分,前2數字和最後3位數字。
  • 製作一個巨大的if-else語句首先檢查前兩位數字,然後檢查最後3位數內的範圍。
  • 或者,將拉鍊轉換爲十六進制,並查看是否可以使用較小的組來做同樣的事情。
  • 找出所有有效的郵政編碼範圍內是否有更多有效的郵政編碼與無效的郵政編碼。寫上面的代碼針對較小的組。
  • 將散列分解爲單獨的文件,並通過Ajax將其作爲用戶類型加載到郵政編碼中。所以也許分成兩部分,第一部分爲前2位數字,第二部分爲後3位。

最後,我計劃使用另一個程序而不是手工生成JavaScript文件。

編輯:表演在這裏很重要。如果它不吸吮,我確實想使用它。 JavaScript代碼執行的性能+下載時間。

編輯2:請僅使用JavaScript解決方案。我沒有訪問應用程序服務器,加上,這會使這成爲一個完整的其他問題=)

+0

你有一個奇怪的想法「有趣」 – 2009-03-05 01:58:04

+0

因爲我們這些不想給你我們的郵政編碼的人不會輸入類似「12345」......這是有效的(Schenectady,NY)。:P – Thanatos 2010-06-05 19:27:18

回答

2

我想編寫一個JavaScript函數,驗證郵政編碼

可能是更多的努力比它的價值,保持更新,以便在任何時候,一個人真實有效的郵政編碼被拒絕。您也可以嘗試外部服務,或者做其他人的工作,並接受任何5位數字!

這裏是優化過的直線哈希表,我能想到的列表

對不起,慣了潛在的娛樂,但你可能不會比JavaScript的對象來管理更好的實際表現在用作散列表時會給你。對象成員訪問是JS中最常見的操作之一,並且將進行超級優化;即使從計算機科學的角度來看,構建自己的數據結構也不可能勝過它。特別是,使用'Array'的任何東西都不會像你想象的那樣好,因爲Array實際上是作爲Object(hashtable)本身實現的。

話雖如此,如果您只需要知道'是否有效',一個可能的空間壓縮工具將使用一個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'填充版本效率很低。傳統的減少方法是例如。對其進行64位編碼:

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

這會使100000個標誌降至16.6kB。不幸的是,atob僅支持Mozilla,因此其他瀏覽器需要額外的base64解碼器。 (這並不難,但解碼啓動時間更長)。也可以使用AJAX請求將直接二進制字符串(以ISO-8859-1文本編碼到responseText)進行傳輸。那會降到12.5kB。

但實際上,只要您使用mod_deflate處理腳本,即使是天真的版本,也可以做任何事情,mod_deflate可以壓縮很多冗餘,還可以重複使用'\ x00' 「無效」代碼的範圍。

0

假設你有一個排序數組中的拉鍊(如果你控制數據結構),看看一個簡單的二進制搜索是否足夠快。

+0

其速度不夠快,但JS代碼會很大,這會很糟糕。我沒有提到這一點,但它的要求,是啊=) – mkoryak 2009-03-05 02:07:15

+0

如果大小是一個問題,打開gzipping和緩存;這是一種透明的方式來縮短下載時間而不會混淆您的邏輯。 – 2009-03-05 03:04:59

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)。

+0

+1給予大O規格。 – 2009-03-05 02:07:28

0

所以...你正在做客戶端驗證,並希望優化文件大小?你可能無法擊敗一般壓縮。幸運的是,大多數瀏覽器都支持gzip,所以你可以免費使用它。

怎麼樣一個簡單的json編碼字典或列表中的郵政編碼排序順序和查字典。它會壓縮得很好,因爲它是一個可預測的序列,因爲它是json,使用瀏覽器內置的解析器很容易導入,查找也可能非常快,因爲這是一個JavaScript基元。