Парни, упустил один момент. В тексте по которому идет поиск, присутствуют html теги, соответственно поиск их учитывает, попытался решить проблему вот так
function fnSearch(arr, pattern) { return arr.filter(function(product) { return pattern .replace(/\<.*?>/g, "") .trim() .toLowerCase() .split(/\s+/) .every(function(p) { return product.html.toLowerCase().includes(p) }); }); } не помогло, потом вот так function fnSearch(arr, pattern) { return arr.filter(function(product) { return pattern .text() .trim() .toLowerCase() .split(/\s+/) .every(function(p) { return product.html.toLowerCase().includes(p) }); }); } не сработало Подсобите еще разок? |
Alexko64,
name чем не устроило? |
Alexko64,
function fnSearch(arr, pattern) { return arr.filter(function(product) { return pattern .trim() .toLowerCase() .split(/\s+/) .every(function(p) { return $("<div/>", {html : product.html}).text().toLowerCase().includes(p) }); }); } |
Цитата:
|
Нашел баг или вернее специфику работы скрипта. Он не учитывает место нахождения первой буквы из запроса.
Если есть такие вариенты на сайте: Samsung Galaxy Note 5 4GB RAN 64GB ROM Samsung Galaxy Note 6 2GB RAM 128 ROM Samsung Galaxy Note 7 4GB RAM 256 GB ROM SAmsung Galaxy Note 8 6GB RAM 512 GB ROM И поискать Samsung Galaxy Note 6, то скрипт покажет все результаты, потому-что везде есть цифра 6 и не важно в каком месте она находится. Аналогично скрипт покажет все результаты на любой из следующих запросов: sung alaxy, laxy 6 и тд... Для наглядности залил пример на хостинг http://mobidor.zzz.com.ua/test.php |
Alexko64,
|
Alexko64, ну тут палка о двух концах, если говорить о цифрах.
Samsung Galaxy Note 5 4GB RAN 64GB ROM - здесь 6, но это размер и полный 64 Samsung Galaxy Note 6 2GB RAM 128 ROM - здесь 6, но модель Как понять при вводе чего ищет пользователь - модель или размер. Пусть угадали, размер, но и 64 не равно 64GB. К тому же размер ведь не только у ROM, но и RAM, что нужно возвращать если не указано GB (128 ROM) - нет или где попадется подходящее? Вообще все это похоже на фильтр, вот только фильтр всегда определяет не только значения, но и какому параметру они принадлежат, в строке же искать такое задача нелегкая. PS. Да еще если строки имеют ошибки, как у вас, не обязательно, что это так и есть, но от них никто не застрахован. |
Alexko64,
function escapeRegExp(string){ return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function fnSearch(arr, pattern) { return arr.filter(function(product) { var text = $("<div/>", {html : product.html}).text().toLowerCase(); return pattern .trim() .toLowerCase() .split(/\s+/) .every(function(p) { p = escapeRegExp(p); p = new RegExp("(^|\\s)" + p, "i"); return p.test(text) }); }); } |
Цитата:
|
Цитата:
Уж тогда организовывать на клиенте фильтр, как это бы был запрос в базу по параметрам. Искать не в строке, а объектах: { brand: "Samsung", line: "Galaxy Note", model: 5, ram: 4, rom: 64 }, .... Тогда проблем с подбором не будет. Главная проблема, это сделать интерактивное поле для поиска (если поиск, а не фильтр с выбором параметров), которое бы по мере ввода предлагало выбор следующего параметра, следующего, сопоставляя каждый ввод с предложенным параметром, и так до завершения ввода. В итоге нужно искать среди параметров объектов совпадения из полученного при вводе объекта. |
Часовой пояс GMT +3, время: 17:00. |