então eu quero usar uma instrução switch como esta:
switch (scrollLeft) {
case (<1000):
//do stuff
break;
case (>1000 && <2000):
//do stuff
break;
}
Agora eu sei que qualquer uma dessas declarações ( <1000
) ou ( >1000 && <2000
) não funcionará (por diferentes razões, obviamente). O que estou pedindo é a maneira mais eficiente de fazer exatamente isso. Eu odeio usar 30 if
instruções, então prefiro usar a sintaxe do switch. Existe algo que eu possa fazer?
your_mapper_object[scrollLeft / SOME_CONST]
, assumindo queyour_mapper_object
é algo parecido{1: some_func, 2: another_func, ...}
. E, neste caso, você também pode usar o switch.Respostas:
Quando analisei as soluções nas outras respostas, vi algumas coisas que sei que são ruins para o desempenho. Eu os colocaria em um comentário, mas achei melhor compará-lo e compartilhar os resultados. Você pode testar você mesmo . Abaixo estão meus resultados (ymmv) normalizados após a operação mais rápida em cada navegador (multiplique o tempo 1,0 com o valor normalizado para obter o tempo absoluto em ms).
Teste onde foi executado no Windows 7 32bit com as seguintes versões: Chrome 21.0.1180.89m , Firefox 15.0 , Opera 12.02 , MSIE 9.0.8112 , Safari 5.1.7 . O nó foi executado em uma caixa de 64 bits do Linux porque a resolução do timer no Node.js para Windows era 10ms em vez de 1ms.
se imediato
Este é o mais rápido em todos os ambientes testados, exceto em ... drumroll MSIE! (surpresa surpresa). Esta é a maneira recomendada de implementá-lo.
se indireto
Essa é uma variante,
switch-indirect-array
mas com, emif
vez disso, e executa muito mais rapidamente do queswitch-indirect-array
em quase todos os ambientes testados.interruptor imediato
Isso é muito rápido em todos os ambientes testados e, na verdade, o mais rápido no MSIE. Funciona quando você pode fazer um cálculo para obter um índice.
switch-range
Isso é cerca de 6 a 40 vezes mais lento que o mais rápido em todos os ambientes testados, exceto no Opera, onde leva cerca de uma vez e meia o tempo. É lento porque o mecanismo precisa comparar o valor duas vezes para cada caso. Surpreendentemente, o Chrome leva quase 40 vezes mais tempo para concluir isso em comparação com a operação mais rápida do Chrome, enquanto o MSIE leva apenas 6 vezes mais. Mas a diferença horária real foi de apenas 74ms a favor do MSIE em 1337ms (!).
switch-range2
Esta é uma variante de,
switch-range
mas com apenas uma comparação por caso e, portanto, mais rápida, mas ainda muito lenta, exceto no Opera. A ordem da instrução do caso é importante, pois o mecanismo testará cada caso na ordem do código-fonte ECMAScript262: 5 12.11matriz indireta
Nesta variante, os intervalos são armazenados em um array. Isso é lento em todos os ambientes testados e muito lento no Chrome.
pesquisa linear de matriz
Essa é uma combinação de uma pesquisa linear de valores em uma matriz e a instrução switch com valores fixos. O motivo pelo qual alguém pode querer usar isso é quando os valores não são conhecidos até o tempo de execução. É lento em todos os ambientes testados e leva quase 10 vezes mais tempo no MSIE.
comutador binário de matriz
Esta é uma variante de,
array-linear-switch
mas com uma pesquisa binária. Infelizmente, é mais lento que a pesquisa linear. Não sei se é minha implementação ou se a pesquisa linear é mais otimizada. Também pode ser que o espaço da chave seja pequeno.Conclusão
Se o desempenho for importante, use
if
-statements ouswitch
com valores imediatos.fonte
Uma alternativa:
Demonstração: http://jsfiddle.net/UWYzr/
fonte
if(...) else if(...)
? Isso evita,if
mas não soa como um substituto bonito para mim.if
-statements. Veja minha resposta aquiSó funciona se você tiver etapas regulares ...
EDIT: como esta solução continua a ser positiva, devo aconselhar que a solução da mofolo é muito melhor
fonte
Math.round(scrollLeft/1000)
pelo caminho.Você pode criar um objeto personalizado com os critérios e a função correspondente aos critérios
Defina funções para o que você deseja fazer nesses casos (defina função1, função2 etc)
E "avaliar" as regras
Nota
Muitas vezes, se as instruções forem mais fáceis de ler e manter. Eu recomendaria o exposto somente quando você tiver muitas condições e uma possibilidade de muito crescimento no futuro.
Atualização
Como o @Brad apontou nos comentários, se as condições forem mutuamente exclusivas (apenas uma delas pode ser verdadeira por vez), verificar o limite superior deve ser suficiente:
desde que as condições sejam definidas em ordem crescente (primeiro a mais baixa
0 to 1000
e depois,1000 to 2000
por exemplo)fonte
action=function1
- não deveriam ser dois pontos? ;-) - Você também pode refatorar isso para ter apenas um limite superior, pois, devido ao processo de eliminação, não pode se enquadrar em dois grupos - a menos que tenha sido sua intenção (ter várias ações possíveis).O que exatamente você está fazendo
//do stuff
?Você pode fazer algo como:
fonte
Não testado e inseguro se isso funcionará, mas por que não fazer alguns
if statements
antes, para definir variáveis para oswitch statement
.fonte
Esta é outra opção:
fonte
Atualizando a resposta aceita (ainda não pode comentar). A partir de 1/12/16, usando a demo jsfiddle no chrome, switch-imediato é a solução mais rápida.
Resultados: Resolução temporal: 1,33
Acabado
fonte
No meu caso (codificando por cores uma porcentagem, nada crítico para o desempenho), escrevi rapidamente isso:
fonte
Ultimamente, tive a mesma situação, foi assim que resolvi:
antes:
depois de:
E se você definir "1, 2, 3, 4, 5", pode ser ainda mais simples:
fonte