2017-02-24 12 views
3

Ich gehe durch die FreeCodeCamp Mutations Herausforderung. Hier ist, was ich zu tun habe:Finden von Übereinstimmungen in zwei Arrays mit indexOf

Return true, wenn die Zeichenfolge in das erste Element des Arrays enthält alle Buchstaben des Strings in dem zweiten Element des Arrays.

Zum Beispiel sollte ["Hallo", "Hallo"] sollte True zurückgeben, da alle Buchstaben in der zweiten Zeichenfolge im ersten, ignorierenden Fall vorhanden sind.

Die Argumente ["Hallo", "hey"] sollten false zurückgeben, da die Zeichenfolge "Hallo" kein "y" enthält.

Schließlich, ["Alien", "Linie"] sollte True zurückgeben, da alle Buchstaben in "Zeile" in "Alien" vorhanden sind.

Dies ist meine Lösung. Leider funktioniert es nicht, obwohl ich denke, dass es möglich ist, das Problem so zu lösen. Wo ist mein Fehler? Hier

ist der Code mit meiner ausführlichen Bemerkungen:

function mutation(arr) { 

    //indexOf is case sensitive, so first we make all the elements in the array lowerCase. After that we use the lowerCaseArray instead of our original array 

var y = arr.join(" "); 
var x = y.toLowerCase(); 
var lowerCaseArray = x.split(" ") 

// This variable will contain the number of matches 

var matchCounter = 0; 

//The for loop picks a letter from the second element 
//(lowerCaseArray[1][i]) of an array and then we look 
//if a match in the first element of an array(lowerCaseArray[0] is found). 
//If there is a match, then the indexOf would return a number >=0. 
//In this case we add 1 to our matchCounter. 

for (i = 0; i < lowerCaseArray[1].length; i++) { 
    if(lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) > 0) { 
    matchCounter+= 1; 

    } 

//Finally we compare the matchCounter length with the second 
//element of our array. If matchCounter >= the length of our 
//array, it means every letter in the second element was found 
//within the first element 

} 
return matchCounter >= arr[1].length; 

} 

mutation(["floor", "for"]); 

Aus irgendeinem Grund return lowerCaseArray[1][i]; gibt ‚o‘, obwohl der letzte Buchstabe des zweiten Elements ist „r“. Und in dem gegebenen Beispiel ist matchCount gleich 2, aber es sollte 3 sein, weil es 3 Übereinstimmungen gibt. Vielleicht ist das der Teil mit einem Fehler.

+0

Ich lief Ihren Code und es geht richtig durch alle 3 Buchstaben, 'f',' o' und 'r'. Kannst du nochmal laufen und verifizieren? –

+0

Es tut, aber es gibt false zurück, weil der matchCounter 2 gleich ist, wenn 3. –

Antwort

1

Die Zeile Code verursacht das falsche Ergebnis zurück ist diese:

if (lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) > 0) { 

Es ignoriert die Möglichkeit, dass der gesuchte Charakter in der 0-Position sein könnte.

Ändern der > zu >= bringt es zum arbeiten. Ihre Kommentare zeigen tatsächlich an, dass es >= sein sollte, aber Ihr Code verwendet >.

Es gibt ein paar andere Orte, an denen der Code etwas weniger verschachtelt werden könnte. Siehe unten:

function mutation(arr) { 
 

 
    //indexOf is case sensitive, so first we make all the elements in the array lowerCase. After that we use the lowerCaseArray instead of our original array 
 

 
    var lowerCaseArray = arr.map(function (str) { 
 
     return str.toLowerCase(); 
 
    }); 
 

 
    // the for loop checks each letter in the second string 
 
    // if any of its letters is not present in the first one, 
 
    // return false immediately 
 
    for (i = 0; i < lowerCaseArray[1].length; i++) { 
 
    if (lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) === -1) { 
 
     return false; 
 
    } 
 
    } 
 
    
 
    // if the for loop completed without returning, then the strings pass the test. 
 
    return true; 
 
} 
 

 
console.log(mutation(["floor", "for"]));

0
if(lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) > -1)? 
2

Sie müssen für ungleiche -1 überprüfen, weil Null 0 ein gültiger Index der Zeichenfolge ist.

if (lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) !== -1) { 
//             ^^^^^^ 

function mutation(arr) { 
 
    var y = arr.join(" "), 
 
     x = y.toLowerCase(), 
 
     lowerCaseArray = x.split(" "), 
 
     matchCounter = 0, 
 
     i; 
 

 
    for (i = 0; i < lowerCaseArray[1].length; i++) { 
 
     if (lowerCaseArray[0].indexOf(lowerCaseArray[1][i]) !== -1) { 
 
      matchCounter += 1; 
 
     } 
 
    } 
 
    return matchCounter >= arr[1].length; 
 
} 
 

 
console.log(mutation(["floor", "for"]));

0

Alternativ können Sie auch regex verwenden. Dies erspart Ihnen auch Probleme bei der Übereinstimmung.

Probe

function validate(arr){ 
 
    var regex_str = arr[0].replace(/[^a-z0-9 ]/gi, function(m){ return "\\" + m }) 
 
    var regex = new RegExp("^[" + regex_str + "]*$", "i"); 
 
    var valid = regex.test(arr[1]); 
 
    console.log(regex, "|", arr[1], "|", valid) 
 
    return valid 
 
} 
 

 
validate(["floor", "for"]) 
 
validate(["floor", "fora"]) 
 
validate(["heworld", "hello World "]) 
 
validate(["heworld", "hello World "]) 
 
validate(["heworldts(*) ", "hello World (test *)"])

+0

Dies würde brechen, wenn die erste Zeichenfolge Zeichen wie '\' oder ']' enthielt. – JLRishe

+0

@JLRishe Danke, dass Sie darauf hingewiesen haben. Bitte überprüfen Sie das Update. – Rajesh

0

Versuchen Sie dies einmal ('singen', 'Singer') entsprechen.

var match=function(a,b) 
{ 
    var nomatch=0; 
    var w1=a.toLowerCase(); 
    var word1=w1.split(''); 
    var string2=b.toLowerCase(); 
    console.log('word1 len : '+word1.length+' '+string2+' length : '+string2.length); 
     for(var i=0;i<word1.length;i++) 
    { 
     if(string2.indexOf(word1[i])==-1) 
     { 
      console.log('no match : '+b+' .indexOf('+word1[i]+')'); 
      nomatch +=1; 
     } 
     else 
     { 
      console.log('match : '+b+'.indexOf('+word1[i]+')'); 

     } 
    } 
    if(nomatch>0) 
    { 
     console.log(b+' does not have all characters of '+a); 
    } 
    else 
    { 
     console.log(b+' do have all characters of '+a); 
    } 

} 
match('hello','Hell'); 
Verwandte Themen