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であるため、一般的なケースでは線形に動作します。

すべてのケースが定数の文字列または数値である場合、エンジンは評価を自由に最適化できるため (かなり単純です)、一定の時間の複雑さを期待できます。

線形よりも優れた動作を強制したい場合はMap、ルックアップ テーブルとして aを使用する必要があります。

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 に答える