0

基本的に、メインの文字列に含まれている配列から単語を取得する必要があります

ここにループコードがありますが、トリックを実行するためのワンライナーがあると思います。コードの長さだけでなく、パフォーマンスも最適化する必要があります。

ありがとう

var aValidWords = ["ex", "exes", "expert", 
                   "experts", "expertise", "sex", "sexes", 
                   "exchange", "change", "changes"];
var sMainWord = "expertsExchange";
var aPossibleWords = new Array();

var sMainWordLower = sMainWord.toLowerCase();
for(i=0; i < aValidWords.length; i++){
    var sCurrentWord = aValidWords[i].toLowerCase();
    if(sMainWordLower.indexOf(sCurrentWord) != -1){
        aPossibleWords.push(aValidWords[i]);
    }
}

document.write(aPossibleWords.join("<br />"));
4

3 に答える 3

3

3つの可能な実装を比較しました。

代替案1 -forループの使用:

function alternative1(aValidWords, sMainWordLower) {
    var aPossibleWords1 = [];
    for(i=0; i < aValidWords.length; i++){
        if(sMainWordLower.indexOf(aValidWords[i]) != -1){
            aPossibleWords1.push(aValidWords[i]);
        }
    }
    return aPossibleWords1;
}

代替案2 - jQuerygrep関数を使用する:

function alternative2(aValidWords, sMainWordLower) {
    return $.grep(aValidWords, function(word) {
              return sMainWordLower.indexOf(word) != -1;                    
         }
    )
}

代替案3 -JavaScriptネイティブフィルターメソッド(IE9、Chrome、Firefox、Opera、Safari)を使用する:

function alternative3(aValidWords, sMainWordLower) {
    return aValidWords.filter(function(word) {
              return sMainWordLower.indexOf(word) != -1;                    
         }
    )
}

Chromeプロファイルツールで実行時間を測定しました。各選択肢は、ランダムなミリオンワードの配列を使用して10回実行されました。結果は次のとおりです。

  • 代替案1:20回の実行->21,68秒
  • 代替案2:20回の実行->26,31秒
  • 代替案3:20回の実行->34,66秒

ネイティブのJavaScriptフィルター関数がとても遅いという事実に驚きました。

自分で実行時間を測定したくない場合は、jsFiddleがあります。スクリプトが完了するまでに少し時間がかかります。

一般に、これら3つの選択肢が最も簡単です。それらの実行時間があなたに合っている場合は、それらの1つを使用してください。そうでない場合は、@Pumbaa80の答えが正しいものです。

[アップデート]

結果の説明(JQuery grep関数がネイティブJavaScriptフィルター関数よりも高速である理由)については、この質問/回答をご覧ください。 @Alexanderのおかげで、 jsFiddleコードもjsPerfに移植されました。

于 2012-12-23T16:43:50.507 に答える
1

あなたのコードはまともだと思います。

パフォーマンスが本当に心配な場合は、Boyer-Moore のような洗練された方法を試してみてください。ただし、少数のパターンと比較的短い文字列しかない場合は、初期化のオーバーヘッドがメリットよりも高くなるため、単純なアプローチを使用する必要があります。ウィキペディアの比較表を参照してくださいhttp://en.wikipedia.org/wiki/String_searching_algorithm#Single_pattern_algorithms

于 2012-12-23T17:01:41.737 に答える
1

このループは間違いなくあなたが持っているものよりも簡潔ですが、さまざまなブラウザーでいくつかのテストを実行して、どちらが速いかを調べる価値があります. おそらくRegexマッチングの方が速いと思いますが、Regex をコンパイルすることでパフォーマンスが低下するかどうかに興味があります。

for(var i=0; i<aValidWords.length; i++) {
    if (new RegExp(aValidWords[i], 'i').test(sMainWord))
        aPossibleWords.push(aValidWords[i]);
}
于 2012-12-23T16:21:20.817 に答える