2016-06-21 17 views
0

EDITindexOf(): Gibt es eine bessere Möglichkeit, dies zu implementieren?

Danke Jungs, und ich entschuldige mich für in meiner Frage nicht präziser sein. Dieser Code wurde geschrieben, um zu prüfen, ob sich ein Zeichen in der zweiten Zeichenfolge in der ersten Zeichenfolge befindet. Wenn ja, wird es wahr, sonst ein false.

So funktioniert mein Code, ich weiß so viel, aber ich bin überzeugt, dass es einen besseren Weg geben muss, dies zu implementieren.

Denken Sie daran, dies ist eine Codierung Herausforderung von Freecodecamp Javascript-Baum.

Hier ist mein Code:

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"]);

Es muss ein besserer Weg, dies zu tun. Ich habe kürzlich über die Map-Funktion erfahren, bin mir aber nicht sicher, wie ich das verwenden soll, und habe kürzlich auch von einer Array.prototype.every() -Funktion erfahren, die ich heute Abend lesen werde.

Vorschläge? Gedanken?

+0

kann mit einer Frage besser gewesen – sathya

+1

dies zu implementieren - was ist das? –

+0

Es gibt 'Array.prototye.some()' und 'Array.prototype.every()' Methoden, die Sie je nach Ihren Wünschen betrachten sollten. Wenn Sie die vorhandenen Zeichen filtern möchten, können Sie wie folgt vorgehen: 'stringTwo.filter (c => stringOne.includes (c))' – Redu

Antwort

1

die Frage ist sehr vage. Aber was ich aus dem Code verstehe, ist, dass Sie nach Zeichenfolgenübereinstimmung zwischen zwei Zeichenfolgen suchen müssen.

Da Sie seine zwei Saiten kennen, würde ich sie nur als zwei Parameter übergeben. Zusätzlich würde ich die while-Anweisung in eine for-Anweisung ändern und einen Break/Continue hinzufügen, um die Verwendung von Variablen get und set zu vermeiden.

Beachten Sie, dass im schlimmsten Fall ist es fast das gleiche, aber im besten Fall seine halbe Rechenzeit.

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

Danke Kumpel, und ich entschuldige mich für die Unbestimmtheit der Frage; Ich hätte genauer sein sollen. Aber ja, du hast meine Frage beantwortet und ich habe anscheinend mehr zu lesen :) Danke. – Nathan

Verwandte Themen