编写JavaScript邮政编码验证功能

时间:2009-03-05 01:49:20

标签: javascript hash compression zipcode

我想通过检查邮政编码是否确实存在来编写验证邮政编码的JavaScript函数。以下是所有邮政编码的列表:

http://www.census.gov/tiger/tms/gazetteer/zips.txt(我只关心第二栏)


这实际上是一个压缩问题。我想这样做很有趣。好的,现在已经不在了,这里是我能想到的直接散列表的优化列表,随意添加我没有想到的任何东西:

  • 将邮政编码分为2部分,前2位数字和后3位数字。
  • 首先检查前两位数字,然后检查最后3位数内的范围。
  • 或者,将拉链转换为十六进制,看看我是否可以使用较小的组做同样的事情。
  • 查明是否在所有有效邮政编码的范围内,有效邮政编码与无效邮政编码相对应。写下针对较小群体的上述代码。
  • 将哈希分解为单独的文件,并通过Ajax作为zipcode中的用户类型加载它们。所以也许分为两部分,第一部分为前2位,第二部分为最后3位。

最后,我计划使用其他程序生成JavaScript文件,而不是手工生成。

编辑:性能在这里很重要。我确实想要使用它,如果它不吸。 JavaScript代码执行的性能+下载时间。

编辑2:仅限JavaScript解决方案。我没有访问应用程序服务器,加上,这将使这成为一个完整的其他问题=)

6 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:2)

  

我想编写一个验证邮政编码的JavaScript函数

可能需要付出更多努力,保持更新,以免任何人真正有效的邮政编码被拒绝。您也可以尝试外部服务,或者做其他人做的事情,只接受任何5位数字!

  

这是我可以想到的直接哈希表的优化列表

很抱歉破坏潜在的Fun,但是你可能不会比JavaScript的Object在用作哈希表时提供更好的实际性能。对象成员访问是JS中最常见的操作之一,将进行超级优化;建立自己的数据结构不太可能超越它,即使从计算机科学的角度来看它们可能是更好的结构。特别是,使用'Array'的任何东西都不会像你想象的那样好,因为Array实际上是作为Object(哈希表)本身实现的。

话虽如此,如果你只需要知道“有效与否”,可能的空间压缩工具就是使用一个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为脚本提供服务,即使是天真的版本也可以做任何事情,这会消除大量冗余,并且还会为所有长距离重复'\ x00' '无效'代码。

答案 2 :(得分:1)

我使用Google Maps API检查邮政编码是否存在。

更准确。

答案 3 :(得分:0)

假设你已经在一个排序数组中得到了拉链(如果你控制数据结构的生成,似乎很公平),看看一个简单的二进制搜索是否足够快。

答案 4 :(得分:0)

答案 5 :(得分:0)

所以......您正在进行客户端验证并希望优化文件大小?你可能无法击败一般压缩。幸运的是,大多数浏览器都支持gzip,所以你可以免费使用它。

一个简单的json编码的dict或列表如何以排序顺序的邮政编码,并查看字典。它会很好地压缩,因为它是一个可预测的序列,因为它是json,使用浏览器内置解析器很容易导入,并且查找也可能非常快,因为这是一个javascript原语。