Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поиск слова в тексте (https://javascript.ru/forum/misc/38085-poisk-slova-v-tekste.html)

Pavel834 18.05.2013 17:16

Поиск слова в тексте
 
Всем привет! 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);
}

zebra 18.05.2013 17:48

Не будет работать в ие. А так код просто сравнивает 1-й символ строки myName с каждым символом строки text. Если символы совпадают, то он проверяет совпадение на целое слово. Хотя зачем такое делать, я не знаю :) Можно с помощью string.search найти позицию начала вхождения.
if( text.search('pavel') != -1) {
   alert('Нашло')
}

Aetae 18.05.2013 19:27

Цитата:

Сообщение от zebra (Сообщение 251319)
Не будет работать в ие. А так код просто сравнивает 1-й символ строки myName с каждым символом строки text. Если символы совпадают, то он проверяет совпадение на целое слово. Хотя зачем такое делать, я не знаю :) Можно с помощью string.search найти позицию начала вхождения.
if( text.search('pavel') != -1) {
   alert('Нашло')
}

Не search, а indexOf. Search - для regexp.
И ваш код не полностью повторяет функционал приведённого.(с другой стороны приведённый код делает чушь :) )

NeoN 18.05.2013 19:57

проще написать код так:
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);
}


теперь будет отображаться массив найденных целых имен, а не отдельных символов

zebra 18.05.2013 20:18

Да уж, забываю я про indexOf

Aetae 18.05.2013 21:59

Цитата:

Сообщение от NeoN (Сообщение 251334)
проще написать код так:
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);
}


теперь будет отображаться массив найденных целых имен, а не отдельных символов

Во первых спецсимволы в имени всё поломают, а во вторых это бессмыслено, т.к. массив будет наполняться одним и тем же именем - regexp не нужен.

Pavel834 19.05.2013 00:11

Может я не правильно выразился в начале в чем суть моего вопроса:) В первую очередь я хочу разобраться===понять как работает именно тот код (это учебный код), который я привел в самом начале, а имено строки 8-10. Почему старт и финиш цикла записано именно так? Что происходит в цикле при таких условиях?
for (var j=i; j< (myName.length +i);j++) { 
            if (text[j] === myName[j-i]) {
                hits.push (text[j]);
            }
}

edison 19.05.2013 16:33

За рамками этого цикла i принимает позицию вхождения первого символа из переменной myName.
В этом цикле идет перебор символов начиная от этой позиции до i + длинна переменной myName (что логично, ведь мы ищем слово опр длинны и нам нет смысла смотреть дальше этой длинны)
j с каждым прохождением цикла увеличивается на 1 , соответственно если j-i вначале будет 0 потом 1,2,3 итд.
т.е. мы берем и сравниваем каждый символ с позиции i с символами переменной myName и если символы совпали, то добавляет этот символ в массив hits. Идет сдвиг на 1 символ и все повторяется)
Тут есть недоработка в том, что если в тексте будет неполное имя или хотя бы первый символ из имени, то в массив hits этот символ(-ы) попадет)

BallsShaped 19.05.2013 19:10

Цитата:

Сообщение от Pavel834
это учебный код

А чему учит этот код? Что задачу, которую можно решить в одну строчку (RegExp( "\\b" + myName + "\\b" ).test( text )), нужно решать через условие, вложенное в цикл, вложенный в условие, вложенное в цикл?

Aetae 19.05.2013 19:31

Цитата:

Сообщение от BallsShaped (Сообщение 251510)
А чему учит этот код? Что задачу, которую можно решить в одну строчку (RegExp( "\\b" + myName + "\\b" ).test( text )), нужно решать через условие, вложенное в цикл, вложенный в условие, вложенное в цикл?

1. Ты не знаешь задачи.
2. Учебные коды на то и учебные, чтоб показывать как оно работает.
3. Если уж решать задачу как её понял ты, то через indexOf. Если регулярки явно не нужны - не следует их применять, ибо это усложняет код и повышает вероятность багов.

Однако, данный конкретный код как учебный - гавно:
1. Используется некроссбраузерное обращение к строке как к массиву.
2. В целом циклы построены избыточно и некрасиво.
3. Сам код делает какую-то чушь и ту криво.(это заявление может быть пересмотрено если таки объяснят, что на самом деле код должен делать)


Часовой пояс GMT +3, время: 12:04.