Поиск слова в тексте
Всем привет! JS изучать только начал и не могу понять логику фрагмента нижеследующего кода. Понятно всё, кроме того, что происходит с 8 по 10 строку включительно (можно ли было написать весь код проще?). Заранее спасибо.
var text, myName, hits; text = " any text any text any text any text any Pavel text any text any text any text any text any text Pavel any text any text any text"; myName = "Pavel"; hits = []; for (i=0; i < text.length; i++) { if (text[i] === myName[0]) { for (var j=i; j< (myName.length +i);j++) { if (text[j] === myName[j-i]) { hits.push (text[j]); } } } } if (hits.length === 0) { console.log("Your name wasn't found!"); } else { console.log(hits); } |
Не будет работать в ие. А так код просто сравнивает 1-й символ строки myName с каждым символом строки text. Если символы совпадают, то он проверяет совпадение на целое слово. Хотя зачем такое делать, я не знаю :) Можно с помощью string.search найти позицию начала вхождения.
if( text.search('pavel') != -1) { alert('Нашло') } |
Цитата:
И ваш код не полностью повторяет функционал приведённого.(с другой стороны приведённый код делает чушь :) ) |
проще написать код так:
var text, myName, hits, reg; text = " any text any text any text any text any Pavel text any text any text any text any text any text Pavel any text any text any text"; myName = "Pavel"; hits = []; reg = new RegExp(myName,"g","i"); hits = text.match(reg); if (!hits) { alert("Your name wasn't found!"); } else { alert(hits); } теперь будет отображаться массив найденных целых имен, а не отдельных символов |
Да уж, забываю я про indexOf
|
Цитата:
|
Может я не правильно выразился в начале в чем суть моего вопроса:) В первую очередь я хочу разобраться===понять как работает именно тот код (это учебный код), который я привел в самом начале, а имено строки 8-10. Почему старт и финиш цикла записано именно так? Что происходит в цикле при таких условиях?
for (var j=i; j< (myName.length +i);j++) { if (text[j] === myName[j-i]) { hits.push (text[j]); } } |
За рамками этого цикла i принимает позицию вхождения первого символа из переменной myName.
В этом цикле идет перебор символов начиная от этой позиции до i + длинна переменной myName (что логично, ведь мы ищем слово опр длинны и нам нет смысла смотреть дальше этой длинны) j с каждым прохождением цикла увеличивается на 1 , соответственно если j-i вначале будет 0 потом 1,2,3 итд. т.е. мы берем и сравниваем каждый символ с позиции i с символами переменной myName и если символы совпали, то добавляет этот символ в массив hits. Идет сдвиг на 1 символ и все повторяется) Тут есть недоработка в том, что если в тексте будет неполное имя или хотя бы первый символ из имени, то в массив hits этот символ(-ы) попадет) |
Цитата:
|
Цитата:
2. Учебные коды на то и учебные, чтоб показывать как оно работает. 3. Если уж решать задачу как её понял ты, то через indexOf. Если регулярки явно не нужны - не следует их применять, ибо это усложняет код и повышает вероятность багов. Однако, данный конкретный код как учебный - гавно: 1. Используется некроссбраузерное обращение к строке как к массиву. 2. В целом циклы построены избыточно и некрасиво. 3. Сам код делает какую-то чушь и ту криво.(это заявление может быть пересмотрено если таки объяснят, что на самом деле код должен делать) |
Часовой пояс GMT +3, время: 12:04. |