Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > поиск подстроки


Автор: 31416 4.11.2008, 15:56
вообщем есть текстовый фильтр который работает на js
суть в следующем - с сервера подгружается список некоторых объектов (текстовые строки)
далле юзер может фильтровать эти строки - вводит некоторый текст и откидываются строки которые НЕ содержат его (текст юзера) как подстроку.

все совдится к тому что эта ф-я:

        var text_filter = function check_filter(text, search)
        {                    
            
            if(text.toLowerCase().indexOf(search.toLowerCase()) + 1)
                return true;                            
            
            return false;
        }

вызывается примерно по циклу для пары сотен строк, так вот это очень медленно работает
если строк скажем несколько сотен. 

я так понимаю что скорее всего медленно работает indexOf.. и нужно искать какую то ему альтернативу...

 подскажите как ускорить?

Автор: Michael.de 4.11.2008, 19:38
31416, если передавать в ф-цию вместо search уже готовый search.toLowerCase(), то выполнение чуть ускорится (я добавил else):
Код

...
search=search.toLowerCase();
...
var text_filter = function check_filter(text, search){
 if (text.toLowerCase().indexOf(search + 1) return true;
 else return false;
}

можно поэкспериментировать и вытащить check_filter() в отдельную ф-цию:
Код

var text_filter = check_filter(tvoj_text, tvoj_search);
...
function check_filter(text, search){
 if (text.toLowerCase().indexOf(search + 1) return true;
 else return false;
}

P.S. можно ещё короче... вместо:
Код

...
 if (text.toLowerCase().indexOf(search + 1) return true;
 else return false;
...
использовать
Код

...
 text.toLowerCase().indexOf(search + 1) ? return true : return false;
...
 smile
P.P.S. единственное, что не понял... что делает между скобок +1: indexOf(search + 1) ?

Автор: SelenIT 4.11.2008, 20:12
Цитата(Michael.de @  4.11.2008,  19:38 Найти цитируемый пост)
что делает между скобок +1

Видимо, превращает -1 в 0, а 0 в 1 - для получения однозначного булевского рез-та smile

Хотя, конечно, и короче, и логичнее было бы написать это как
Код

function check_filter(text, search){
   return (text.toLowerCase().indexOf(search) != -1);
}


Автор: Michael.de 4.11.2008, 20:47
Цитата(SelenIT @  4.11.2008,  20:12 Найти цитируемый пост)
Видимо, превращает -1 в 0, а 0 в 1 - для получения однозначного булевского рез-та 

упс, это я скобку пропустил, надо было так:
Код

text.toLowerCase().indexOf(search) + 1) ? return true : return false;

Автор: lusever 4.11.2008, 21:03
Регулярное выражение тут будет работать быстрее:
Код

var rex = new RegExp(search, 'im')
check_filter(text, rex)
function check_filter(text, rex)
{
  return rx.test(text)
}

Регексп конечно же лучше кэшировать и эскейпить.

Автор: IDVsbruck 5.11.2008, 00:05
Однозначно регулярка! И проще, и гораздо шустрее ...

Автор: 31416 5.11.2008, 09:59
да, спасибо! попробвал регулярку стало более менее, хотя все-равно чувствуется на больших объекмах..
тут советовали еще соединить все строки в одну, и сразу одним применением регулярки
отобрать нужные - было бы скорее всего еще быстрее,чем по циклу, но пока и так устраивает)

Автор: IDVsbruck 5.11.2008, 12:59
Если объем текста очень приличный, то может быть эффективней отдать это серверу - отдавать ему вводимый пользователем текст и разбирать на серваке, а клиенту возвращать только требуемое.

Автор: mxt 7.11.2008, 19:47
возможно нужно оптимизировать, но не только тут,


у вас примерно такой план работы:
1. задаются параметры фильтра,
2. Фильтруются строки
3, Вывод отфильтрованных данных пользователю.


Возможно нужно проводить оптимизацию в 3 пункте?

Автор: 31416 15.11.2008, 21:39
IDVsbruck, да чего то не хочется сервер такими задачами напрягать..

mxt, а какая там в 3-ем может быть оптимизация? там просто хтмл строится и все

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)