복붙노트

[JQUERY] 보다 큼 /보다 적게보다는위한 스위치 문

JQUERY

보다 큼 /보다 적게보다는위한 스위치 문

해결법


  1. 1.나는 다른 답변에서 솔루션을 보았을 때 나는 성능을 위해 나쁜 알고 있다는 몇 가지를 보았다. 내가 주석에 넣어 거라고하지만 난 벤치 마크를 더 나은이었고, 그 결과를 공유하고 생각했다. 당신은 스스로를 테스트 할 수 있습니다. 다음은 각 브라우저 (MS의 절대 시간을 얻을 수있는 표준화 된 값을 곱하면 1.0 시간)에서 가장 빠른 수술 후 내 결과 (YMMV)를 정규화한다.

    나는 다른 답변에서 솔루션을 보았을 때 나는 성능을 위해 나쁜 알고 있다는 몇 가지를 보았다. 내가 주석에 넣어 거라고하지만 난 벤치 마크를 더 나은이었고, 그 결과를 공유하고 생각했다. 당신은 스스로를 테스트 할 수 있습니다. 다음은 각 브라우저 (MS의 절대 시간을 얻을 수있는 표준화 된 값을 곱하면 1.0 시간)에서 가장 빠른 수술 후 내 결과 (YMMV)를 정규화한다.

                        Chrome  Firefox Opera   MSIE    Safari  Node
    -------------------------------------------------------------------
    1.0 time               37ms    73ms    68ms   184ms    73ms    21ms
    if-immediate            1.0     1.0     1.0     2.6     1.0     1.0
    if-indirect             1.2     1.8     3.3     3.8     2.6     1.0
    switch-immediate        2.0     1.1     2.0     1.0     2.8     1.3
    switch-range           38.1    10.6     2.6     7.3    20.9    10.4
    switch-range2          31.9     8.3     2.0     4.5     9.5     6.9
    switch-indirect-array  35.2     9.6     4.2     5.5    10.7     8.6
    array-linear-switch     3.6     4.1     4.5    10.0     4.7     2.7
    array-binary-switch     7.8     6.7     9.5    16.0    15.0     4.9
    

    크롬 21.0.1180.89m, 파이어 폭스 15.0, 오페라 12.02, MSIE 9.0.8112, 사파리 5.1.7 : 윈도우 7 folowing 버전과 32 비트에서 수행 테스트합니다. Windows 용 Node.js를에 타이머 해상도 대신이 1ms 10ms의 이었기 때문에 노드는 리눅스 64 비트 상자에서 실행되었다.

    이에 ... 드럼 롤 MSIE를 제외한 모든 테스트 환경에서 가장 빠른! (놀랍게도). 이것은을 구현하는 권장 방법입니다.

    if (val < 1000) { /*do something */ } else
    if (val < 2000) { /*do something */ } else
    ...
    if (val < 30000) { /*do something */ } else
    

    이 스위치 간접 배열의 변형이지만,와 경우 명령문 훨씬 빠른 스위치 간접 배열보다는 대신하고 수행하는 거의 모든 테스트 환경이다.

    values=[
       1000,  2000, ... 30000
    ];
    if (val < values[0]) { /* do something */ } else
    if (val < values[1]) { /* do something */ } else
    ...
    if (val < values[29]) { /* do something */ } else
    

    이 MSIE에서 가장 빠른 모든 테스트 환경에서 꽤 빨리이며, 실제로. 당신이 인덱스를 얻을 수있는 계산을 할 수있는 때 작동합니다.

    switch (Math.floor(val/1000)) {
      case 0: /* do something */ break;
      case 1: /* do something */ break;
      ...
      case 29: /* do something */ break;
    }
    

    이것은 느린 제외한 모든 테스트 환경에서 가장 빠른 것보다 6 ~ 40 배에 관한 것입니다 오페라 것이 긴으로 1.5 시간 정도 걸립니다 곳. 이 엔진 때문에 느린 각각의 경우에 대해 두 배의 값을 비교한다. MSIE는 긴으로 6 시간을 소요하면서 놀랍게도, 크롬에서 가장 빠른 동작에 비해이를 완료하는 데 거의 40 배 이상 크롬 걸립니다. 그러나 차이가 있었다 실제 시간은 1337ms에서 MSIE에 찬성 74ms (!).

    switch (true) {
      case (0 <= val &&  val < 1000): /* do something */ break;
      case (1000 <= val &&  val < 2000): /* do something */ break;
      ...
      case (29000 <= val &&  val < 30000): /* do something */ break;
    }
    

    이 스위치 범위 만 하나 때문에 빠른 경우에 따라 비교와 변종이다,하지만 여전히 아주 느린 오페라를 제외하고. 엔진이 소스 코드를 주문 ECMAScript262에서 각각의 경우를 테스트하기 때문에 케이스 문의 순서는 중요 : 5 12.11

    switch (true) {
      case (val < 1000): /* do something */ break;
      case (val < 2000): /* do something */ break;
      ...
      case (val < 30000): /* do something */ break;
    }
    

    이 변형에서 범위 배열에 저장된다. 이 모든 테스트 환경에서 느리고 크롬에서 매우 느립니다.

    values=[1000,  2000 ... 29000, 30000];
    
    switch(true) {
      case (val < values[0]): /* do something */ break;
      case (val < values[1]): /* do something */ break;
      ...
      case (val < values[29]): /* do something */ break;
    }
    

    이 배열에서 값의 선형 조합의 검색, 스위치이며 고정 된 값으로 문. 하나는이를 사용하는 것이 좋습니다 이유가있을 때 값은 런타임 때까지 알 수 없습니다. 그것은 모든 테스트 환경에서 느린, 긴 MSIE에서 거의 10 시간이 걸립니다.

    values=[1000,  2000 ... 29000, 30000];
    
    for (sidx=0, slen=values.length; sidx < slen; ++sidx) {
      if (val < values[sidx]) break;
    }
    
    switch (sidx) {
      case 0: /* do something */ break;
      case 1: /* do something */ break;
      ...
      case 29: /* do something */ break;
    }
    

    이 배열 선형 스위치하지만 이진 검색을 가진 변종이다. 불행하게도 그것은 선형 검색보다 느립니다. 선형 검색이 더 최적화되어있는 경우 내 구현 또는 나도 몰라. 또한 키 스페이스는 소형 인 것이 될 수있다.

    values=[0, 1000,  2000 ... 29000, 30000];
    
    while(range) {
      range = Math.floor( (smax - smin) / 2 );
      sidx = smin + range;
      if ( val < values[sidx] ) { smax = sidx; } else { smin = sidx; }
    }
    
    switch (sidx) {
      case 0: /* do something */ break;
      ...
      case 29: /* do something */ break;
    }
    

    성능이 중요한 경우, 즉시 값을 갖는 경우 명령문 또는 스위치를 사용하십시오.


  2. 2.대안:

    대안:

    var scrollleft = 1000;
    switch (true)
    {
        case (scrollleft > 1000):
          alert('gt');
          break;
        case (scrollleft <= 1000):
          alert('lt');
          break; 
    }
    

    데모 : http://jsfiddle.net/UWYzr/


  3. 3.

    switch (Math.floor(scrollLeft/1000)) {
      case 0: // (<1000)
       //do stuff
       break;
      case 1: // (>=1000 && <2000)
       //do stuff;
       break;
    }
    

    당신이 일정한 단계에있는 경우에만 작동 ...

    편집 :이 솔루션은 upvotes을 받고 유지하기 때문에, 그 mofolo의 솔루션은 더 나은 방법입니다 조언한다


  4. 4.당신은 기준에 해당하는 기준에 사용자 지정 개체 및 기능을 만들 수 있습니다

    당신은 기준에 해당하는 기준에 사용자 지정 개체 및 기능을 만들 수 있습니다

    var rules = [{ lowerLimit: 0,    upperLimit: 1000, action: function1 }, 
                 { lowerLimit: 1000, upperLimit: 2000, action: function2 }, 
                 { lowerLimit: 2000, upperLimit: 3000, action: function3 }];
    

    당신은 (, 기능 2 등 기능 1을 정의)이 경우에 수행 할 작업에 대한 함수를 정의

    그리고 규칙 "평가"

    function applyRules(scrollLeft)
    {
       for(var i=0; i>rules.length; i++)
       {
           var oneRule = rules[i];
           if(scrollLeft > oneRule.lowerLimit && scrollLeft < oneRule.upperLimit)
           {
              oneRule.action();
           }
       }
    }
    

    노트

    여러 번 문을 읽고 유지하기 쉽다 경우. 난 당신이 많은 조건과 미래의 성장의 많은 가능성이있는 경우에만 위의를 추천 할 것입니다.

    최신 정보 @ 브래드는 의견에서 지적 조건이 상호 배타적 인 경우, 충분해야 상한을 확인 (단지 그들 중 하나는 한 번에 사실 수 있습니다) :

    if(scrollLeft < oneRule.upperLimit)
    

    조건이 오름차순으로 정의되어 제공 (제 1 최저 한, 0-1000, 그리고 1000 내지 2000, 예를 들어)


  5. 5.정확히 물건을 할 // 무슨에서 뭐하는거야?

    정확히 물건을 할 // 무슨에서 뭐하는거야?

    당신이 뭔가를 할 수 있습니다 :

    (scrollLeft < 1000) ? //do stuff
    : (scrollLeft > 1000 && scrollLeft < 2000) ? //do stuff
    : (scrollLeft > 2000) ? //do stuff
    : //etc. 
    

  6. 6.테스트되지 않은이 의지의 작품은, 그러나 왜 몇을 할 경우 확실 경우 문, 전에 스위치 문에 대한 설정 변수.

    테스트되지 않은이 의지의 작품은, 그러나 왜 몇을 할 경우 확실 경우 문, 전에 스위치 문에 대한 설정 변수.

    var small, big;
    
    if(scrollLeft < 1000){
        //add some token to the page
        //call it small
    }
    
    
    switch (//reference token/) {
      case (small):
       //do stuff
       break;
      case (big):
       //do stuff;
       break;
    }
    

  7. 7.이것은 또 다른 옵션입니다 :

    이것은 또 다른 옵션입니다 :

         switch (true) {
             case (value > 100):
                 //do stuff
                 break;
             case (value <= 100)&&(value > 75):
                 //do stuff
                 break;
             case (value < 50):
                //do stuff
                 break;
         }
    

  8. 8.허용 대답 업데이트 (아직 말씀 드릴 수 없습니다). 크롬에서 데모 jsfiddle을 사용하여 1/12/16로, 스위치 즉시 가장 빠른 솔루션입니다.

    허용 대답 업데이트 (아직 말씀 드릴 수 없습니다). 크롬에서 데모 jsfiddle을 사용하여 1/12/16로, 스위치 즉시 가장 빠른 솔루션입니다.

    결과 : 시간 분해능 : 1.33

       25ms "if-immediate" 150878146 
       29ms "if-indirect" 150878146
       24ms "switch-immediate" 150878146
       128ms "switch-range" 150878146
       45ms "switch-range2" 150878146
       47ms "switch-indirect-array" 150878146
       43ms "array-linear-switch" 150878146
       72ms "array-binary-switch" 150878146
    

    끝마친

     1.04 (   25ms) if-immediate
     1.21 (   29ms) if-indirect
     1.00 (   24ms) switch-immediate
     5.33 (  128ms) switch-range
     1.88 (   45ms) switch-range2
     1.96 (   47ms) switch-indirect-array
     1.79 (   43ms) array-linear-switch
     3.00 (   72ms) array-binary-switch
    

  9. 9.내 경우에는 (컬러 코딩 비율은, 아무것도 성능이 중요한)는, 나는 빨리이를 썼다 :

    내 경우에는 (컬러 코딩 비율은, 아무것도 성능이 중요한)는, 나는 빨리이를 썼다 :

    function findColor(progress) {
        const thresholds = [30, 60];
        const colors = ["#90B451", "#F9A92F", "#90B451"];
    
        return colors.find((col, index) => {
            return index >= thresholds.length || progress < thresholds[index];
        });
    }
    

  10. 10.나는 그것을 해결하는 방법을 그건, 요즘 같은 상황했다 :

    나는 그것을 해결하는 방법을 그건, 요즘 같은 상황했다 :

    전에:

    if(wind_speed >= 18) {
        scale = 5;
    } else if(wind_speed >= 12) {
        scale = 4;
    } else if(wind_speed >= 9) {
        scale = 3;
    } else if(wind_speed >= 6) {
        scale = 2;
    } else if(wind_speed >= 4) {
        scale = 1;
    }
    

    후:

    var scales = [[4, 1], [6, 2], [9, 3], [12, 4], [18, 5]];
    scales.forEach(function(el){if(wind_speed > el[0]) scale = el[1]});
    

    사용자가 설정 한 경우 "1, 2, 3, 4, 5는"다음은 더 간단 할 수있다 :

    var scales = [4, 6, 9, 12, 18];
    scales.forEach(function(el){if(wind_speed >= el) scale++});
    
  11. from https://stackoverflow.com/questions/6665997/switch-statement-for-greater-than-less-than by cc-by-sa and MIT license