5

我的网站上有以下 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 语句的数量或常数时间呈线性关系?如果是线性的,有没有更好的方法来编写这段代码,所以不管我编码的特殊情况有多少,它都是恒定的时间?

4

2 回答 2

3

该规范不为该switch语句提供任何时间复杂度保证。然而,它的语义需要对case表达式进行顺序评估,因此在一般情况下它的行为是线性的。

如果所有情况都是常量字符串或数字(这相当简单),引擎可以自由地优化评估,因此您可以预期恒定的时间复杂度。

如果要强制执行优于线性的行为,则需要使用 aMap作为查找表:

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)尽管没有正式要求,但所有引擎都实现了属性查找。

于 2016-12-12T20:59:33.717 回答
2

这是 ES5 中 Bergi 的答案。与您现在使用的相比,它会更快并且更容易修改。

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;
}
于 2016-12-12T22:34:18.460 回答