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. Сам код делает какую-то чушь и ту криво.(это заявление может быть пересмотрено если таки объяснят, что на самом деле код должен делать)

Pavel834 21.05.2013 13:29

edison,
большое спасибо за исчерпывающий ответ, соответствующий моему вопросу.
BallsShaped,
на данном этапе моих познаний меня не интересует оптимизация этого кода, как его сделать короче и т.д. Сейчас я пока пытаюсь понять работу циклов.

Asha 04.09.2014 16:57

Цитата:

Сообщение от Aetae (Сообщение 251514)
если таки объяснят, что на самом деле код должен делать)

Этот код из упражнений codecademy.com, курс JS для новичков, циклы FOR так сказать Introduction.
Задача искать слово в тексте. В конце они предлагают погуглить и самостоятельно усовершенствовать код.
("Search the Internet to see if there are any built-in JavaScript string methods that can help!")
до этого были вроде более разумные задания... может это сделано для наглядности, что цикл можно помещать в цикл.


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