Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.01.2019, 21:30
Интересующийся
Отправить личное сообщение для Alexko64 Посмотреть профиль Найти все сообщения от Alexko64
 
Регистрация: 17.04.2018
Сообщений: 26

Помогите подправить поиск на сайте
Есть у меня скрипт для сортировки и поиска элементов на странице.
Поиск учитывает последовательность слов в запросе. Тоисть если у меня элемент называется Samsung Galaxy и я делаю поиск по запросу Galaxy Samsung то ничего не находит, а запрос Samsung находит элемент.
Помогите поправить скрипт что-бы он не учитывал последовательность слов.
Вот кусок кода отвечающего за поиск:
SLS.isearch.on('keyup',function(){
			var results = []; 
			var toSearch = SLS.isearch.val();
			if(toSearch=='') { 
				SLS.prod = products;
			}else{
				for(var i=0; i<SLS.sproducts.length; i++) {
					if(SLS.sproducts[i].name.toLowerCase().indexOf(toSearch.toLowerCase())!=-1) {
					 results.push(SLS.sproducts[i]);
					}
				}
				SLS.prod = results;
			}
			SLS.page=1;
			SLS.products.html('');
			SLS.sorta(SLS.isort);
		});

Последний раз редактировалось Alexko64, 25.01.2019 в 11:19.
Ответить с цитированием
  #2 (permalink)  
Старый 24.01.2019, 22:00
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Alexko64,
вы что-то не договариваите ...
alert("Samsung Galaxy".toLowerCase().indexOf("Galaxy".toLowerCase()) != -1);
Ответить с цитированием
  #3 (permalink)  
Старый 24.01.2019, 23:25
Интересующийся
Отправить личное сообщение для Alexko64 Посмотреть профиль Найти все сообщения от Alexko64
 
Регистрация: 17.04.2018
Сообщений: 26

В каком смысле? Я не автор скрипта, что не так?
Скинул часть, вроде она отвечает за поиск, там еще кусок для сортировки.
Нужен целиком?
Ответить с цитированием
  #4 (permalink)  
Старый 25.01.2019, 00:10
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Alexko64,
могу только гадать, возможно в name продукта есть только Samsung
SLS.sproducts[i].name, Samsung Galaxy в другом месте.
Ответить с цитированием
  #5 (permalink)  
Старый 25.01.2019, 12:01
Интересующийся
Отправить личное сообщение для Alexko64 Посмотреть профиль Найти все сообщения от Alexko64
 
Регистрация: 17.04.2018
Сообщений: 26

Сообщение от рони Посмотреть сообщение
Alexko64,
могу только гадать, возможно в name продукта есть только Samsung
SLS.sproducts[i].name, Samsung Galaxy в другом месте.
Вот полный скрипт с двумя примерами. В обоих примерах есть слова Samsung и Galaxy, но попробуйте ввести в поиск samsung galaxy или galaxy samsung. Скрипт учтет порядок слов и покажет только один результат или вовсе никакого

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<div>Search: <input type="search" class="simple-input" id="isearch" placeholder="Start typing...">
</div>
<br><br><br>
<div id="products"></div>
<script>
var products = [
	
	{name:'Samsung Galaxy s9',
	html:'<div>Samsung Galaxy S9</div>'
	},
		{name:'Galaxy S9 Samsung',
	html:'<div>Galaxy S9 Samsung</div>'
	},
	
	
	];
	</script>
	
	<script>
 	var SLS = {
	products: $('#products'),
	plow:$('#plow'),
	phigh:$('#phigh'),
	isearch:$('#isearch'),
	prod:products,
	sproducts: products,
	page:1,
	limit:12,
	isort:0,
	init:function(){
		SLS.pload(SLS.page,SLS.limit);
		SLS.events();
	},
	pload:function(page,limit){ 
		for(var i=((page-1)*limit);i<(limit*page);i++){ 
			if(SLS.prod[i])
				SLS.products.append($(SLS.prod[i].html));
		}
	},
	sorta:function(type){
			var byPrice = SLS.prod.slice(0);
			byPrice.sort(function(a,b) {
				return a.price - b.price;
			});
			if(type==1)
				byPrice=byPrice.reverse();
			SLS.prod=byPrice; 
			SLS.page=1;
			SLS.products.html('');
			SLS.pload(SLS.page,SLS.limit);
	},
	events:function(){
		$(window).on('scroll',function(){ 
			if($(this).scrollTop()+250>=($(document).height() - window.innerHeight-$('footer').height())){
				SLS.page++;
				SLS.pload(SLS.page,SLS.limit);
			}
		});
		SLS.plow.on('click',function(){
			SLS.isort=0;
			SLS.sorta(SLS.isort);
		});
		SLS.phigh.on('click',function(){
			SLS.isort=1;
			SLS.sorta(SLS.isort);
		});
		SLS.isearch.on('keyup',function(){
			var results = []; 
			var toSearch = SLS.isearch.val();
			if(toSearch=='') { 
				SLS.prod = products;
			}else{
				for(var i=0; i<SLS.sproducts.length; i++) {
					if(SLS.sproducts[i].name.toLowerCase().indexOf(toSearch.toLowerCase())!=-1) {
					 results.push(SLS.sproducts[i]);
					}
				}
				SLS.prod = results;
			}
			SLS.page=1;
			SLS.products.html('');
			SLS.sorta(SLS.isort);
		});
	}
};
SLS.init();
	</script>
</div>

Последний раз редактировалось Alexko64, 25.01.2019 в 12:04.
Ответить с цитированием
  #6 (permalink)  
Старый 25.01.2019, 12:10
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Alexko64
Скрипт учтет порядок слов и покажет только один результат
Все верно, ведь сравниваются строки. Производите сравнение рег. выражением, то есть по шаблону задаваемому значением в поле, где вместо пробела будет | - samsung|galaxy, тогда хоть так samsung|galaxy, хоть так galaxy|samsung, будет найдено все.
Ответить с цитированием
  #7 (permalink)  
Старый 25.01.2019, 12:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Alexko64,
<script>
function escapeRegExp(string){
    return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}

function fnSearch(arr, pattern) {
        pattern = escapeRegExp(pattern);
        pattern = new RegExp("^(" + pattern.trim().replace(/\s+/g, "|") + ")", "i");
        return arr.filter(function(el) {
                return Object.values(el).some(function(val) {
                        return pattern.test(val)
                })
        })
};

var products = [

    {name:'Samsung Galaxy s9',
    html:'<div>Samsung Galaxy S9</div>'
    },
        {name:'Galaxy S9 Samsung',
    html:'<div>Galaxy S9 Samsung</div>'
    },


    ];
    </script>

    <script>
 	var SLS = {
    products: $('#products'),
    plow:$('#plow'),
    phigh:$('#phigh'),
    isearch:$('#isearch'),
    prod:products,
    sproducts: products,
    page:1,
    limit:12,
    isort:0,
    init:function(){
        SLS.pload(SLS.page,SLS.limit);
        SLS.events();
    },
    pload:function(page,limit){
        for(var i=((page-1)*limit);i<(limit*page);i++){
            if(SLS.prod[i])
                SLS.products.append($(SLS.prod[i].html));
        }
    },
    sorta:function(type){
            var byPrice = SLS.prod.slice(0);
            byPrice.sort(function(a,b) {
                return a.price - b.price;
            });
            if(type==1)
                byPrice=byPrice.reverse();
            SLS.prod=byPrice;
            SLS.page=1;
            SLS.products.html('');
            SLS.pload(SLS.page,SLS.limit);
    },
    events:function(){
        $(window).on('scroll',function(){
            if($(this).scrollTop()+250>=($(document).height() - window.innerHeight-$('footer').height())){
                SLS.page++;
                SLS.pload(SLS.page,SLS.limit);
            }
        });
        SLS.plow.on('click',function(){
            SLS.isort=0;
            SLS.sorta(SLS.isort);
        });
        SLS.phigh.on('click',function(){
            SLS.isort=1;
            SLS.sorta(SLS.isort);
        });
        SLS.isearch.on('keyup',function(){
            var results = [];
            var toSearch = SLS.isearch.val();
            if(toSearch=='') {
                SLS.prod = products;
            }else{

                SLS.prod = fnSearch(SLS.sproducts, toSearch);

            }
            SLS.page=1;
            SLS.products.html('');
            SLS.sorta(SLS.isort);
        });
    }
};
SLS.init();
    </script>
Ответить с цитированием
  #8 (permalink)  
Старый 25.01.2019, 12:29
Интересующийся
Отправить личное сообщение для Alexko64 Посмотреть профиль Найти все сообщения от Alexko64
 
Регистрация: 17.04.2018
Сообщений: 26

Сообщение от laimas Посмотреть сообщение
Все верно, ведь сравниваются строки. Производите сравнение рег. выражением, то есть по шаблону задаваемому значением в поле, где вместо пробела будет | - samsung|galaxy, тогда хоть так samsung|galaxy, хоть так galaxy|samsung, будет найдено все.
К сожалению я не знаю как это сделать, по этому и обратился за помощью. Если вы можете написать что на что заменить то буду очень благодарен
Ответить с цитированием
  #9 (permalink)  
Старый 25.01.2019, 12:30
Интересующийся
Отправить личное сообщение для Alexko64 Посмотреть профиль Найти все сообщения от Alexko64
 
Регистрация: 17.04.2018
Сообщений: 26

пока писал ответ не увидел что уже ответили )
Ответить с цитированием
  #10 (permalink)  
Старый 25.01.2019, 12:32
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

рони, надо бы наверное trim() для входного значения, и \s более одного?

Видимо перепил, trim есть.

Последний раз редактировалось laimas, 25.01.2019 в 12:37.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Помогите, подскажите. Просмотр изображений на сайте с помощью javascript. Max25 Работа 1 13.04.2013 03:01
Помогите найти статью на этом сайте Опан Общие вопросы Javascript 2 20.03.2013 16:29
Нашел на сайте XSS скрипт. Помогите разобраться. klermonte Общие вопросы Javascript 0 15.02.2013 23:35
Мгновенный поиск, подсветка, переход к найденному rdfhnbhf Javascript под браузер 0 05.07.2012 12:28