Написание функции проверки почтового индекса JavaScript

StackOverflow https://stackoverflow.com/questions/613316

Вопрос

Я хотел бы написать JavaScript функция, которая проверяет почтовый индекс, проверяя, существует ли почтовый индекс на самом деле.Вот список всех почтовых индексов:

http://www.census.gov/tiger/tms/gazetteer/zips.txt (Меня волнует только 2-я колонка)


Это действительно проблема сжатия.Я хотел бы сделать это ради удовольствия.Хорошо, теперь с этим покончено, вот список оптимизаций для прямой хэш-таблицы, о которых я могу подумать, не стесняйтесь добавлять все, о чем я не подумал:

  • Разбейте почтовый индекс на 2 части, первые 2 цифры и последние 3 цифры.
  • Сделайте гигантский оператор if-else, сначала проверяя первые 2 цифры, затем проверяя диапазоны в пределах последних 3 цифр.
  • Или скройте молнии в hex и посмотрите, смогу ли я сделать то же самое, используя меньшие группы.
  • Узнайте, есть ли в пределах диапазона всех действительных почтовых индексов больше действительных почтовых индексов по сравнению с недействительными почтовыми индексами.Напишите приведенный выше код, ориентированный на меньшую группу.
  • Разбейте хэш на отдельные файлы и загрузите их через Ajax в виде пользовательских типов в почтовом коде.Поэтому, возможно, разбейте на 2 части, первую для первых 2 цифр, вторую для последних 3.

Наконец, я планирую сгенерировать файлы JavaScript с помощью другой программы, а не вручную.

Редактировать:здесь важна производительность.Я действительно хочу использовать это, если это не отстойно.Производительность выполнения кода JavaScript + время загрузки.

Правка 2:Пожалуйста, решения только на JavaScript.У меня нет доступа к серверу приложений, к тому же, это превратило бы это в совершенно другую проблему =)

Это было полезно?

Решение

Я хотел бы написать функцию JavaScript, которая проверяет почтовый индекс

Возможно, потребуется больше усилий, чем того стоит, обновлять его, чтобы ни в коем случае не отклонялся чей-то реальный действительный почтовый индекс.Вы также можете попробовать внешний сервис или сделать то, что делают все остальные, и просто принять любой 5-значный номер!

вот список оптимизаций по прямой хэш-таблице, о которых я могу подумать

Извините, что портю потенциальное удовольствие, но вы, вероятно, не добьетесь гораздо лучшей фактической производительности, чем дает объект JavaScript при использовании в качестве хэш-таблицы.Доступ к элементам объекта является одной из наиболее распространенных операций в JS и будет сверхоптимизирован;создание ваших собственных структур данных вряд ли превзойдет это, даже если они потенциально являются лучшими структурами с точки зрения информатики.В частности, все, что использует ‘Array’, будет работать не так хорошо, как вы думаете, потому что Array фактически реализован как сам объект (хэш-таблица).

Сказав это, возможным средством сжатия пространства, если вам нужно только знать "допустимо или нет", было бы использование 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,6 КБ.К сожалению, atob доступен только для Mozilla, поэтому для других браузеров потребуется дополнительный декодер base64.(Это не слишком сложно, но для расшифровки требуется немного больше времени при запуске.) Также может быть возможно использовать AJAX-запрос для прямой передачи двоичной строки (закодированной в тексте ISO-8859-1 в responseText).Это сократило бы его до 12,5 кБ.

Но на самом деле, вероятно, все, даже наивная версия, будет работать до тех пор, пока вы обслуживаете скрипт с использованием mod_deflate , что позволит сократить большую часть этой избыточности, а также повторение '\x00' для всех длинных диапазонов ‘недопустимых’ кодов.

Другие советы

Вы могли бы сделать немыслимое и рассматривать код как число (помните, что на самом деле это не число).Преобразуйте ваш список в серию диапазонов, например:

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

Я использую API Карт Google чтобы проверить, существует ли почтовый индекс.

Это более точно.

Предполагая, что у вас есть zip-файлы в отсортированном массиве (кажется справедливым, если вы контролируете генерацию структуры данных), посмотрите, достаточно ли быстр простой двоичный поиск.

Итак...Вы выполняете проверку на стороне клиента и хотите оптимизировать размер файла?вероятно, вы не сможете превзойти общее сжатие.К счастью, большинство браузеров поддерживают gzip для вас, так что вы можете использовать это бесплатно.

Как насчет простого json-кодированного dict или списка с почтовыми индексами в отсортированном порядке и выполните поиск по dict.он будет хорошо сжиматься, поскольку это предсказуемая последовательность, легко импортироваться, поскольку это json, с использованием встроенного анализатора браузеров, и поиск, вероятно, также будет очень быстрым, поскольку это примитив javascript.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top