@Itvanya

Как понять этот код JavaScript начинающему кодеру?

Код выводит имя из контекста переменной text. Пример взят с codecademy. Тупо не могу понять работу этого большого цикла. Читаю так : пока переменная i посимвольно не переберет всю строку text, продолжай цикл, но если в строке text найдется символ, начинающийся с B, то //тут стартует новый цикл внутри условия, который мне абсолютно не понятен - точнее мне не понятен принцип инициализации новой переменной j. Буду очень благодарен, если объясните, как в данном случае работает весь цикл. Еще раз спасибо, ребята.

var text = "Hey,my is Bobby!";
var myName = "Bobby";
var hits = [];

for ( var i=0; i<text.length; i++ ) {
    if(text[i]==='B'){
        for(var j = i; j < (myName.length + i); j++) {
			hits.push(text[j]);
        }
    }
}

if (hits.length === 0) {
	console.log("Your name wasn't found!");
} else {
	console.log(hits);
}
  • Вопрос задан
  • 5184 просмотра
Решения вопроса 1
nobodynoone
@nobodynoone
Тут прикол в том, что ищется первая буква имени, когда эта буква находится, получаем длину имени и прибавляем к нему 1 (почему 1? вспомните про то, что все массивы начинаются не с 1, а с 0, отсюда и это прибавление). Вот с комментариями

// Строка, где будем искать имя 
var text = "Hey,my is Bobby!";
// Само имя 
var myName = "Bobby";
// Сюда будет пихать буквы имени, которые извлечем из строки 
var hits = [];

// Начинаем цикл, который будет перебирать каждый символ, потому что length возвращает
// количество символов в строке 
for ( var i=0; i<text.length; i++ ) {
    // Такк как мы перебираем не буквы, а числа, поэтому мы получаем символ из строки text
    // передачей позиции символа. Если буква найдена, то продолжаем. 
    if(text[i]==='B'){
        // Вы не поняли, зачем и почему тут j=i, да потому что мы все еще продолжаем искать 
        // символы в той же самой строке, а так как мы этот символ уже нашли, то нету смысла
        // начинать все с самого начала, потому что это неправильно, так как если предположить, что
        //  у нас до этого был перебор посимвольно строки весом скажем, 100Гб, то вы сами можете
        //  понять, что нам незачем еще раз делать то, что мы уже сделали, поэтому мы просто 
        // присваиваем переменной j текущее значение и позицию i и создаем цикл который позволит
        // нам полностью "забрать" слово. Как? Опять же берем длину строки с именем и прибавляем
        // единицу (почему 1? вспомните про то, что все массивы начинаются не с 1, а с 0, отсюда 
        // и это прибавление). 
        for(var j = i; j < (myName.length + i); j++) {
                        // Отправляем букву в массив
			hits.push(text[j]);
        }
    }
}

if (hits.length === 0) {
	console.log("Your name wasn't found!");
} else {
	console.log(hits);
}


Проще просто нельзя :)
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
А если переписать код так:

for ( var i=0; i<text.length; i++ ) {
    if(text[i]==='B'){
        for(var j = 0; j < myName.length; j++) {
			hits.push(text[i + j]);
        }
    }
}


стало понятнее?
Ответ написан
mmmaaak
@mmmaaak
Короче второй цикл берет из строки столько символов, какова длинна переменной myName, и сохраняет их в hits
Ответ написан
Комментировать
@dake1231
Ищет подстроку 'Bobby' в строке 'Hey,my is Bobby!', только коряво как то. Зачем два цикла еще и в массив записывать, indexOf есть же для этого
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы