18.05.2013, 17:16
|
Новичок на форуме
|
|
Регистрация: 18.05.2013
Сообщений: 3
|
|
Поиск слова в тексте
Всем привет! 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);
}
|
|
18.05.2013, 17:48
|
Профессор
|
|
Регистрация: 14.09.2011
Сообщений: 523
|
|
Не будет работать в ие. А так код просто сравнивает 1-й символ строки myName с каждым символом строки text. Если символы совпадают, то он проверяет совпадение на целое слово. Хотя зачем такое делать, я не знаю Можно с помощью string.search найти позицию начала вхождения.
if( text.search('pavel') != -1) {
alert('Нашло')
}
|
|
18.05.2013, 19:27
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,586
|
|
Сообщение от zebra
|
Не будет работать в ие. А так код просто сравнивает 1-й символ строки myName с каждым символом строки text. Если символы совпадают, то он проверяет совпадение на целое слово. Хотя зачем такое делать, я не знаю Можно с помощью string.search найти позицию начала вхождения.
if( text.search('pavel') != -1) {
alert('Нашло')
}
|
Не search, а indexOf. Search - для regexp.
И ваш код не полностью повторяет функционал приведённого.(с другой стороны приведённый код делает чушь )
__________________
29375, 35
|
|
18.05.2013, 19:57
|
Аспирант
|
|
Регистрация: 01.03.2013
Сообщений: 77
|
|
проще написать код так:
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);
}
теперь будет отображаться массив найденных целых имен, а не отдельных символов
|
|
18.05.2013, 20:18
|
Профессор
|
|
Регистрация: 14.09.2011
Сообщений: 523
|
|
Да уж, забываю я про indexOf
|
|
18.05.2013, 21:59
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,586
|
|
Сообщение от NeoN
|
проще написать код так:
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 не нужен.
__________________
29375, 35
|
|
19.05.2013, 00:11
|
Новичок на форуме
|
|
Регистрация: 18.05.2013
Сообщений: 3
|
|
Может я не правильно выразился в начале в чем суть моего вопроса В первую очередь я хочу разобраться===понять как работает именно тот код (это учебный код), который я привел в самом начале, а имено строки 8-10. Почему старт и финиш цикла записано именно так? Что происходит в цикле при таких условиях?
for (var j=i; j< (myName.length +i);j++) {
if (text[j] === myName[j-i]) {
hits.push (text[j]);
}
}
|
|
19.05.2013, 16:33
|
Аспирант
|
|
Регистрация: 01.04.2013
Сообщений: 58
|
|
За рамками этого цикла i принимает позицию вхождения первого символа из переменной myName.
В этом цикле идет перебор символов начиная от этой позиции до i + длинна переменной myName (что логично, ведь мы ищем слово опр длинны и нам нет смысла смотреть дальше этой длинны)
j с каждым прохождением цикла увеличивается на 1 , соответственно если j-i вначале будет 0 потом 1,2,3 итд.
т.е. мы берем и сравниваем каждый символ с позиции i с символами переменной myName и если символы совпали, то добавляет этот символ в массив hits. Идет сдвиг на 1 символ и все повторяется)
Тут есть недоработка в том, что если в тексте будет неполное имя или хотя бы первый символ из имени, то в массив hits этот символ(-ы) попадет)
|
|
19.05.2013, 19:10
|
Профессор
|
|
Регистрация: 14.09.2012
Сообщений: 162
|
|
Сообщение от Pavel834
|
это учебный код
|
А чему учит этот код? Что задачу, которую можно решить в одну строчку ( RegExp( "\\b" + myName + "\\b" ).test( text )), нужно решать через условие, вложенное в цикл, вложенный в условие, вложенное в цикл?
|
|
19.05.2013, 19:31
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,586
|
|
Сообщение от BallsShaped
|
А чему учит этот код? Что задачу, которую можно решить в одну строчку (RegExp( "\\b" + myName + "\\b" ).test( text )), нужно решать через условие, вложенное в цикл, вложенный в условие, вложенное в цикл?
|
1. Ты не знаешь задачи.
2. Учебные коды на то и учебные, чтоб показывать как оно работает.
3. Если уж решать задачу как её понял ты, то через indexOf. Если регулярки явно не нужны - не следует их применять, ибо это усложняет код и повышает вероятность багов.
Однако, данный конкретный код как учебный - гавно:
1. Используется некроссбраузерное обращение к строке как к массиву.
2. В целом циклы построены избыточно и некрасиво.
3. Сам код делает какую-то чушь и ту криво.(это заявление может быть пересмотрено если таки объяснят, что на самом деле код должен делать)
__________________
29375, 35
|
|
|
|