Pergunta

Eu gostaria de escrever uma função JavaScript que valida um código postal, verificando se o CEP realmente existe. Aqui está uma lista de todos os códigos postais:

http://www.census.gov/tiger/tms/gazetteer /zips.txt (I só se preocupam com a 2ª coluna)


Este é realmente um problema de compressão. Eu gostaria de fazer isso por diversão. OK, agora que está fora do caminho, aqui está uma lista de otimizações mais de um hashtable reta que eu posso pensar, sente livre adicionar qualquer coisa que eu não tenha pensado:

  • Break CEP em 2 partes, primeiros 2 dígitos e 3 últimos dígitos.
  • Faça um gigante if-else primeiro verificar os 2 primeiros dígitos, em seguida, verificar intervalos dentro dos últimos 3 dígitos.
  • Ou, converter os zips em hexadecimal, e ver se posso fazer a mesma coisa usando grupos menores.
  • Descubra se dentro da faixa de todos os códigos postais válidos existem códigos postais mais válido vs CEPs inválidos. Escrever o código acima como alvo o grupo menor.
  • Quebra-se o hash em arquivos separados, e carregá-los via Ajax como usuário digita o CEP. Então, talvez quebrar em 2 partes, em primeiro lugar para os primeiros 2 dígitos, segundo a última 3.

Por último, eu pretendo gerar os arquivos JavaScript usando outro programa, não com a mão.

Edit: o desempenho importa aqui. Eu quero usar isso, se ele não chupar. Desempenho da execução + tempo de download de código JavaScript.

Edit 2: JavaScript únicas soluções agradar. Eu não tenho acesso ao servidor de aplicativos, além disso, que faria isso em um outro problema =)

Foi útil?

Solução

Eu gostaria de escrever uma função JavaScript que valida um código postal

Pode ser mais esforço do que vale a pena, mantendo-o atualizado para que a verdadeira CEP válido nenhum ponto de alguém é rejeitada. Você também pode tentar um serviço externo, ou fazer o que todo mundo faz e simplesmente aceitar qualquer número de 5 dígitos!

aqui está uma lista de otimizações mais de um hashtable reta que eu posso pensar

Desculpe a estragar a diversão potencial, mas você provavelmente não está indo para gerir muito melhor real desempenho do que objeto de JavaScript lhe dá quando usado como um hashtable. acesso membro objecto é uma das mais comuns em operações JS e vai ser super-optimizado; construir suas próprias estruturas de dados é improvável que vencê-lo, mesmo se eles são potencialmente melhores estruturas de um ponto de ciência da computação de vista. Em particular, qualquer coisa usando ‘matriz’ não vai funcionar tão bem como você pensa, porque matriz é realmente implementado como um objeto (hashtable) em si.

Dito isto, uma possível ferramenta de compressão espaço se você só precisa saber 'válida ou não' seria a utilização de um campo de bits 100000-bit, embalado em uma string. Por exemplo, para um espaço de apenas 100 ZIP códigos, onde os códigos 032-043 são ‘válidos’:

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)) );
}

Agora só temos de trabalhar para fora a maneira mais eficiente para obter o campo de bits para o script. O '\ versão ingênua cheio de x00' acima é muito ineficiente. As abordagens convencionais para a redução que seria por exemplo. para base64-codificá-lo:

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

Isso seria obter os 100000 bandeiras para baixo para 16.6kB. Infelizmente atob é Mozilla-only, portanto, um decodificador base64 adicional seria necessário para outros navegadores. (Não é muito difícil, mas é um pouco mais de tempo de inicialização para decodificar.) Também pode ser possível usar uma solicitação AJAX para transferir uma string binária direta (codificado em ISO-8859-1 texto para responseText). Que iria buscá-la para baixo para 12.5kB.

Mas, na realidade, provavelmente, qualquer coisa, mesmo a versão ingênua, iria fazer, desde que você serviu o script usando mod_deflate, o que comprime fora um monte de que a redundância, e também a repetição de '\ x00' para todos os longas distâncias de códigos 'inválida'.

Outras dicas

Você poderia fazer o impensável e tratar o código como um número (lembre-se que na verdade não é um número). Converter sua lista em uma série de faixas, por exemplo:

zips = [10000, 10001, 10002, 10003, 23001, 23002, 23003, 36001]
// becomes
zips = [[10000,10003], [23001,23003], [36001,36001]]
// make sure to keep this sorted

, em seguida, para testar:

myzip = 23002;
for (i = 0, l = zips.length; i < l; ++i) {
    if (myzip >= zips[i][0] && myzip <= zips[i][1]) {
        return true;
    }
}
return false;

Este é apenas usando uma pesquisa linear muito ingênuo (O (n)). Se você manteve a lista ordenada e usados ??busca binária, você poderia conseguir O (log n).

Eu uso Google Maps API para verificar se existe um CEP.

É mais preciso.

Assumindo que você tem os zips em um array ordenado (parece justo se você está controlando a geração da estrutura de dados), ver se uma busca binária simples é rápido o suficiente.

Assim ... você está fazendo validação do lado do cliente e deseja otimizar para o tamanho do arquivo? você provavelmente não pode bater de compressão geral. Felizmente, a maioria dos navegadores suportam gzip para você, então você pode usar tanto de forma gratuita.

Como cerca de um json codificado dict simples ou uma lista com os CEPs na ordem de classificação e fazer um olhar-se no dict. ele vai comprimir bem, desde a sua uma sequência previsível, importação facilmente, uma vez que de json, usando os navegadores embutido analisador e pesquisa provavelmente será muito rápido também, já que é um javascript primitivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top