Является ли оператор переключателя JavaScript линейным или постоянным временем?

У меня есть следующий JavaScript на моем сайте, поэтому при выполнении определенных поисковых запросов ответ жестко запрограммирован на определенную страницу:

function redirect() {
    var input = document.getElementById('searchBox').value.toLowerCase();

    switch (input) {
      case 'rectangular':
        window.location.replace('http://www.Example.com/Rectangular/');
        break;
      case 'elephant':
        window.location.replace('http://www.Example.com/Elephants/');
        break;
      case 'coils':
        window.location.replace('http://www.Example.com/Parts/');
        break;
      default: // No keyword detected: submit the normal search form.
        return true;
        break;
    }
    return false; // Don't let the form submit
}

Мне интересно, является ли оператор поиска в JavaScript линейным по количеству операторов case или постоянному времени? Если линейный, есть ли лучший способ написать этот код, так что это постоянное время, независимо от количества особых случаев, которые я кодирую?

2 ответа

Решение

Вот эквивалент ответа Берги в ES5. Это будет быстро и намного легче изменить по сравнению с тем, что вы используете сейчас.

var _redirectlist = {
  'rectangular': 'http://www.Example.com/Rectangular/',
  'elephant': 'http://www.Example.com/Elephants/',
  'coils': 'http://www.Example.com/Parts/'
};

function redirect() {
  var input = document.getElementById('searchBox').value.toLowerCase();

  // Redirect if we have the input in our list
  if (_redirectlist.hasOwnProperty(input)) {
    window.location.replace(_redirectlist[input]);
    return false;
  }

  return true;
}

Спецификация не дает никаких временных гарантий сложности для switch заявление. Это семантика, которая требует последовательной оценки case выражения, однако, так что в общем случае он ведет себя линейно.

Двигатели могут свободно оптимизировать оценку, если все случаи являются постоянными строками или числами (и это довольно просто), поэтому вы можете рассчитывать на постоянную сложность времени.

Если вы хотите обеспечить поведение лучше линейного, вам нужно использовать Map в качестве справочной таблицы:

var redirects = new Map([
    ['rectangular', 'http://www.Example.com/Rectangular/'],
    ['elephant', 'http://www.Example.com/Elephants/'],
    ['coils', 'http://www.Example.com/Parts/']
]);
function redirect() {
    var input = document.getElementById('searchBox').value.toLowerCase();
    if (redirects.has(input)) {
        window.location.replace(redirects.get(input));
        return false; // Don't let the form submit
    } else {
        return true;
    }
}

В среде до ES6 вы также можете использовать объект для той же цели. Все двигатели реализованы O(1) поиск собственности, хотя они формально не обязаны.

Другие вопросы по тегам