我想通过检查邮政编码是否确实存在来编写验证邮政编码的JavaScript函数。以下是所有邮政编码的列表:
http://www.census.gov/tiger/tms/gazetteer/zips.txt(我只关心第二栏)
这实际上是一个压缩问题。我想这样做很有趣。好的,现在已经不在了,这里是我能想到的直接散列表的优化列表,随意添加我没有想到的任何东西:
最后,我计划使用其他程序生成JavaScript文件,而不是手工生成。
编辑:性能在这里很重要。我确实想要使用它,如果它不吸。 JavaScript代码执行的性能+下载时间。
编辑2:仅限JavaScript解决方案。我没有访问应用程序服务器,加上,这将使这成为一个完整的其他问题=)
答案 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原语。