2015-11-18 15 views
9
function mutation(arr) { 

    var tester = arr[1].split(''); 

    for (var i = 0; i < tester.length; i ++) { 
    if (!arr[0].indexOf(tester[i])) return false; 
    } 
    return true; 
    } 

    mutation(["hello", "hey"]); 
function mutation(arr) { 

    var tester = arr[1].split(''); 

    for (var i = 0; i < tester.length; i ++) { 
    if (!arr[0].indexOf(tester[i])) return false; 
    } 
    return true; 
    } 

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

Tutaj powinienem zwrócić wartość true, jeśli ciąg w pierwszym elemencie tablicy zawiera wszystkie litery ciągu w drugim elemencie tablicy.Używanie indexOf() do porównywania znaków w tablicy

Nie widzę żadnych problemów z tym kodem, ale mija tylko 90% testów i nie wiem dlaczego. I nie widzę tam wzoru - jakie dokładnie warunki powinienem spełnić, aby nie zdać testu.

+5

'arr [0] .indexOf (tester [i]) <0', ponieważ' indexOf' zwraca indeks znaków w łańcuchu znaków. Zero oparte. I -1 jeśli char nie jest tam. –

+1

Funkcja 'indexOf' zwróci' int', a nie 'bool' –

+1

@ PanWolf javascript pozwala' truthy'/'falsey' nie zapomnieć. Byłoby to ważne, gdyby użytkownik nie miał nic przeciwko pominięciu pierwszego znaku. – Curt

Odpowiedz

7

indexOf () metoda zwraca indeks w wywołującym obiekcie String obiektu pierwszego wystąpienia sp wartość uświęcona, rozpoczynając wyszukiwanie od fromlndex. Zwraca -1, jeśli wartość nie zostanie znaleziona.

String.prototype.indexOf() zwraca -1, jeśli wartość nie została znaleziona, dlatego Twoje oświadczenie nie działa.

Zmiana:

if (arr[0].indexOf(tester[i]) < 0) return false; 
+0

Nie powinno to być ' (arr [0] .indexOf (tester [i]) <0) '- no'! '? – Curt

+0

Ponadto: 'String.prototype.indexOf() nie zwraca wartości false lub true'. Może być używany jako wartość prawdy. Dodatkowo sposób, w jaki użytkownik go posiada, z '!' Zamieni go na wartość boolowską. – Curt

+0

tak, bez "!" Cholera, czytając dwa razy artykuł MDN naprawdę pomaga.Brak mojej uwagi naprawdę doprowadza mnie do szału. –

3

To nie zadziała, ponieważ klasyfikujesz pierwszą pozycję (pozycja 0) jako nieakceptowalną.

Twój stan będzie spełniony tylko dla wartości, które nie są większe niż 0, gdy 0 również będzie ważny.

Dlatego też zmienić go tak, że tylko zwraca false dla wartości, które są mniejsze niż 0.

Zmiana ta linia:

if (!arr[0].indexOf(tester[i])) return false; 

Do:

if (arr[0].indexOf(tester[i]) < 0) return false; 
+0

Dźwięk jak javascript może przekonwertować 'większy niż 0' na' true' :) –

+1

@ Mr.Wolf nie konwertuje go na true, ale ocenia to jako prawdziwe (prawda) - http://james.padolsey.com/javascript/truthy-falsey/ – Curt

1

rzeczy były naprawdę oczywiste - Górna/małe litery() problem. Działa to teraz:

function mutation(arr) { 

arr[0] = arr[0].toLowerCase(); 
arr[1] = arr[1].toLowerCase(); 
var tester = arr[1].split(''); 
for (var i = 0; i < tester.length; i ++) { 
    if (arr[0].indexOf(tester[i]) == -1) return false; 
} 
    return true; 
} 

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

I oczywiście nie zauważył oczywistą kwestię 0 pozycji:

if (arr[0].indexOf(tester[i]) == -1) return false; 

^ta jest poprawna.

Dziękuję wszystkim!

Powiązane problemy