Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.05.2013, 17:16
Новичок на форуме
Отправить личное сообщение для Pavel834 Посмотреть профиль Найти все сообщения от Pavel834
 
Регистрация: 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);
}
Ответить с цитированием
  #2 (permalink)  
Старый 18.05.2013, 17:48
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

Не будет работать в ие. А так код просто сравнивает 1-й символ строки myName с каждым символом строки text. Если символы совпадают, то он проверяет совпадение на целое слово. Хотя зачем такое делать, я не знаю Можно с помощью string.search найти позицию начала вхождения.
if( text.search('pavel') != -1) {
   alert('Нашло')
}
Ответить с цитированием
  #3 (permalink)  
Старый 18.05.2013, 19:27
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,586

Сообщение от zebra Посмотреть сообщение
Не будет работать в ие. А так код просто сравнивает 1-й символ строки myName с каждым символом строки text. Если символы совпадают, то он проверяет совпадение на целое слово. Хотя зачем такое делать, я не знаю Можно с помощью string.search найти позицию начала вхождения.
if( text.search('pavel') != -1) {
   alert('Нашло')
}
Не search, а indexOf. Search - для regexp.
И ваш код не полностью повторяет функционал приведённого.(с другой стороны приведённый код делает чушь )
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 18.05.2013, 19:57
Аспирант
Отправить личное сообщение для NeoN Посмотреть профиль Найти все сообщения от NeoN
 
Регистрация: 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);
}


теперь будет отображаться массив найденных целых имен, а не отдельных символов
Ответить с цитированием
  #5 (permalink)  
Старый 18.05.2013, 20:18
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

Да уж, забываю я про indexOf
Ответить с цитированием
  #6 (permalink)  
Старый 18.05.2013, 21:59
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 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
Ответить с цитированием
  #7 (permalink)  
Старый 19.05.2013, 00:11
Новичок на форуме
Отправить личное сообщение для Pavel834 Посмотреть профиль Найти все сообщения от Pavel834
 
Регистрация: 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]);
            }
}
Ответить с цитированием
  #8 (permalink)  
Старый 19.05.2013, 16:33
Аспирант
Отправить личное сообщение для edison Посмотреть профиль Найти все сообщения от edison
 
Регистрация: 01.04.2013
Сообщений: 58

За рамками этого цикла i принимает позицию вхождения первого символа из переменной myName.
В этом цикле идет перебор символов начиная от этой позиции до i + длинна переменной myName (что логично, ведь мы ищем слово опр длинны и нам нет смысла смотреть дальше этой длинны)
j с каждым прохождением цикла увеличивается на 1 , соответственно если j-i вначале будет 0 потом 1,2,3 итд.
т.е. мы берем и сравниваем каждый символ с позиции i с символами переменной myName и если символы совпали, то добавляет этот символ в массив hits. Идет сдвиг на 1 символ и все повторяется)
Тут есть недоработка в том, что если в тексте будет неполное имя или хотя бы первый символ из имени, то в массив hits этот символ(-ы) попадет)
Ответить с цитированием
  #9 (permalink)  
Старый 19.05.2013, 19:10
Профессор
Отправить личное сообщение для BallsShaped Посмотреть профиль Найти все сообщения от BallsShaped
 
Регистрация: 14.09.2012
Сообщений: 162

Сообщение от Pavel834
это учебный код
А чему учит этот код? Что задачу, которую можно решить в одну строчку (RegExp( "\\b" + myName + "\\b" ).test( text )), нужно решать через условие, вложенное в цикл, вложенный в условие, вложенное в цикл?
Ответить с цитированием
  #10 (permalink)  
Старый 19.05.2013, 19:31
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,586

Сообщение от BallsShaped Посмотреть сообщение
А чему учит этот код? Что задачу, которую можно решить в одну строчку (RegExp( "\\b" + myName + "\\b" ).test( text )), нужно решать через условие, вложенное в цикл, вложенный в условие, вложенное в цикл?
1. Ты не знаешь задачи.
2. Учебные коды на то и учебные, чтоб показывать как оно работает.
3. Если уж решать задачу как её понял ты, то через indexOf. Если регулярки явно не нужны - не следует их применять, ибо это усложняет код и повышает вероятность багов.

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск определенного слова в тексте faforty Общие вопросы Javascript 4 24.09.2011 15:41
Поиск в тексте javascript jQuery 3 31.05.2011 11:40
Поиск слова на странице kumar6346 Events/DOM/Window 1 29.05.2011 00:09
Поиск слова в исходном коде html страницы klsorat2010 Ваши сайты и скрипты 1 20.05.2010 23:46
Поиск последнего слова в строке AlexFadeev Элементы интерфейса 3 01.04.2010 18:56