2016-06-21 8 views
0

EDITindexOf():これを実装するより良い方法はありますか?

は皆さんに感謝し、私は私の質問に、より具体的なものではないことをお詫び申し上げます。 このコードは、2番目の文字列の文字が最初の文字列に含まれているかどうかをチェックするために作成されています。そうであればtrueを返し、そうでなければfalseを返します。

私のコードはうまくいきますが、私はそれほどよく知っていますが、私は肯定的です。これを実装するにはよりよい方法が必要です。

これはFreecodecampのJavascriptツリーからのコーディングの課題です。ここで

は私のコードです:

function mutation(arr) { 
 

 
    var stringOne = arr[0].toLowerCase(); 
 
    var stringTwo = arr[1].toLowerCase().split(""); 
 
    var i = 0; 
 
    var truthyFalsy = true; 
 

 
    while (i < arr[1].length && truthyFalsy) { 
 

 
    truthyFalsy = stringOne.indexOf(stringTwo[i]) > -1; 
 
    i++ 
 

 
    } 
 
    console.log(truthyFalsy); 
 
} 
 

 

 

 

 
mutation(["hello", "hey"]); 
 
//mutation(["hello", "yep"]);

奨めはこれを行うには良い方法であることがあります。私は最近、マップ関数について学んだが、これを実装するためにそれを使用する方法がわからず、最近私は今夜読む予定のArray.prototype.every()関数について最近知った。

提案?思考?

+0

はこれを実装するために、質問 – sathya

+1

で改善の余地がある - これは何ですか? –

+0

あなたが望むものに応じて、 'Array.prototye.some()'と 'Array.prototype.every()'メソッドがあります。 'stringTwo.filter(c => stringOne.includes(c))'のような既存の文字をフィルタリングする場合は、 – Redu

答えて

1

質問は非常に曖昧です。しかし、コードから理解したことは、2つの文字列の文字列の一致をチェックする必要があるということです。

2つの文字列が分かっているので、2つのパラメータとして渡します。私はwhile文をforに変更し、breakを追加するか、変数getおよびsetを使用しないようにします。

最悪のケースではほぼ同じですが、最良のケースでは計算時間の半分になります。

mutation bestCase 14.84499999999997 
mutation worstCase 7.694999999999993 
bestCase: 5.595000000000027 
worstCase: 7.199999999999989 

// your function (to check performance difference) 
 
function mutation(arr) { 
 

 
    var stringOne = arr[0].toLowerCase(); 
 
    var stringTwo = arr[1].toLowerCase().split(""); 
 
    var i = 0; 
 
    var truthyFalsy = true; 
 

 
    while (i < arr[1].length && truthyFalsy) { 
 

 
    truthyFalsy = stringOne.indexOf(stringTwo[i]) > -1; 
 
    i++ 
 

 
    } 
 
    return truthyFalsy; 
 
} 
 

 

 

 
function hasMatch(base, check) { 
 
    var strOne = base.toLowerCase(); 
 
    var strTwo = check.toLowerCase().split(""); 
 

 
    var truthyFalsy = false; 
 

 
    // define both variables (i and l) before the loop condition in order to avoid getting the length property of the string multiple times. 
 
    for (var i = 0, l = strTwo.length; i < l; i++) { 
 
    var hasChar = strOne.indexOf(strTwo[i]) > -1; 
 
    if (hasChar) { 
 
     //if has Char, set true and break; 
 
     truthyFalsy = true; 
 
     break; 
 
    } 
 
    } 
 
    return truthyFalsy; 
 
} 
 

 
var baseCase = "hello"; 
 
var bestCaseStr = "hey"; 
 
var worstCaseStr = "yap"; 
 

 
//bestCase find match in first iteration 
 
var bestCase = hasMatch("hello", bestCaseStr); 
 
console.log(bestCase); 
 

 
//worstCase loop over all of them. 
 
var worstCase = hasMatch("hello", worstCaseStr); 
 
console.log(worstCase); 
 

 
// on your function 
 
console.log('mutation bestCase', checkPerf(mutation, [baseCase, bestCaseStr])); 
 

 
console.log('mutation worstCase', checkPerf(mutation, [baseCase, worstCaseStr])); 
 

 
// simple performance check 
 
console.log('bestCase:', checkPerf(hasMatch, baseCase, bestCaseStr)); 
 

 
console.log('worstCase:', checkPerf(hasMatch, baseCase, worstCaseStr)); 
 

 
function checkPerf(fn) { 
 
    var t1 = performance.now(); 
 
    for (var i = 0; i < 10000; i++) { 
 
    fn(arguments[1], arguments[2]); 
 
    } 
 
    var t2 = performance.now(); 
 
    return t2 - t1; 
 
}

+0

おかげで、私は質問の漠然としたことをお詫びします。私はより具体的にすべきだった。しかし、はい、あなたは私の質問に答えてくれました。私はもっと読むことがあるようです:)ありがとう。 – Nathan

関連する問題