Я хотел бы написать функцию JavaScript, которая проверяет почтовый индекс
Может потребоваться больше усилий, чем стоит, с обновлением, чтобы ни в коем случае не был отклонен чей-то действительный почтовый индекс. Вы также можете попробовать внешнюю услугу или сделать то, что делают все остальные, и просто принять любой 5-значный номер!
вот список оптимизаций для простой хеш-таблицы, которую я могу придумать
Извините, что испортил потенциальную забаву, но вы, вероятно, не сможете управлять гораздо большей фактической производительностью, чем дает объект JavaScript при использовании в качестве хеш-таблицы. Доступ к элементу объекта является одной из наиболее распространенных операций в JS и будет супероптимизирован; построение ваших собственных структур данных вряд ли превзойдет их, даже если они являются потенциально лучшими структурами с точки зрения информатики. В частности, все, что использует Array, не будет работать так же хорошо, как вы думаете, потому что Array фактически реализован как сам объект (hashtable).
Сказав это, возможный инструмент сжатия пространства, если вам нужно знать только «действительный или нет», будет использовать 100-битное битовое поле, упакованное в строку. Например, для пробела всего 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,6 КБ. К сожалению, atob предназначен только для Mozilla, поэтому для других браузеров потребуется дополнительный декодер base64. (Это не слишком сложно, но для декодирования требуется немного больше времени.) Также возможно использовать запрос AJAX для передачи прямой двоичной строки (закодировано в тексте ISO-8859-1 в responseText). Это уменьшило бы его до 12,5 КБ.
Но на самом деле, вероятно, что-нибудь, даже наивная версия, будет делать, пока вы обслуживаете скрипт, используя mod_deflate, который сжимает большую часть этой избыточности, а также повторение \ x00 для всех длинных диапазонов «неверных» кодов.