2015-11-18 3 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"]); 

Здесь я должен вернуть значение true, если строка в первом элементе массива содержит все буквы строки во втором элементе массива.Использование indexOf() для сравнения символов в массиве

Я не вижу никаких проблем с этим кодом, но он проходит как только 90% тестов, и я не знаю почему. И я не вижу шаблона там - какие точные условия я должен встретиться, чтобы не пройти тест.

+5

'arr [0] .indexOf (тестер [i]) <0', потому что' indexOf' возвращает индекс символа в строке. На основе нуля. И -1, если там нет. –

+1

Функция 'indexOf' вернет' int', а не 'bool' –

+1

@ Mr.Wolf javascript позволяет« правдивость »/« ложь »не забывать. Таким образом, это было бы действительно, если бы пользователь не пропустил первый символ. – Curt

ответ

7

IndexOf () возвращает индекс в вызывающем String объект первого вхождения sp значение, начиная с Искать по fromIndex. Возвращает -1, если значение не найдено.

String.prototype.indexOf() возвращает -1, если значение не найдено, поэтому ваше заявление не работает.

Изменить на:

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

Не должно ли это быть ' (arr [0] .indexOf (тестер [i]) <0) '- no'! '? – Curt

+0

Также: 'String.prototype.indexOf() не возвращает false или true'. Его можно использовать как правдивую ценность. Плюс, как пользователь имеет его, с '!', Преобразует его в логическое. – Curt

+0

да, без "!" Черт, чтение статьи MDN в два раза действительно помогает.Отсутствие моего собственного внимания действительно сводит меня с ума. –

3

Это не сработает, потому что вы классифицируете первое положение (позиция 0) как неприемлемое.

Ваши условия будут действительны только для значений, которые не превышают 0, когда 0 также должен быть действительным.

Поэтому изменить его так, что он возвращает только false для значений, которые меньше 0.

Изменить эту строку:

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

To:

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

Звук, как javascript, может преобразовывать 'больше 0' в' true' :) –

+1

@ Mr.Wolf это не преобразует его в true, но оценивает его как истину (правду) - http://james.padolsey.com/javascript/truthy-falsey/ – Curt

1

вещи были действительно очевидны - Верхний/нижний регистр() вопрос. Это работает сейчас:

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

И, конечно, я не заметил очевидный вопрос 0 позиции:

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

^это правильно.

Спасибо всем!

Смежные вопросы