Поиск слова в тексте
Всем привет! 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, время: 04:22. |