24.01.2019, 21:30
|
Интересующийся
|
|
Регистрация: 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.
|
|
24.01.2019, 22:00
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
Alexko64,
вы что-то не договариваите ...
alert("Samsung Galaxy".toLowerCase().indexOf("Galaxy".toLowerCase()) != -1);
|
|
24.01.2019, 23:25
|
Интересующийся
|
|
Регистрация: 17.04.2018
Сообщений: 26
|
|
В каком смысле? Я не автор скрипта, что не так?
Скинул часть, вроде она отвечает за поиск, там еще кусок для сортировки.
Нужен целиком?
|
|
25.01.2019, 00:10
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
Alexko64,
могу только гадать, возможно в name продукта есть только Samsung
SLS.sproducts[i].name, Samsung Galaxy в другом месте.
|
|
25.01.2019, 12:01
|
Интересующийся
|
|
Регистрация: 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.
|
|
25.01.2019, 12:10
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Alexko64
|
Скрипт учтет порядок слов и покажет только один результат
|
Все верно, ведь сравниваются строки. Производите сравнение рег. выражением, то есть по шаблону задаваемому значением в поле, где вместо пробела будет | - samsung|galaxy, тогда хоть так samsung|galaxy, хоть так galaxy|samsung, будет найдено все.
|
|
25.01.2019, 12:25
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
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>
|
|
25.01.2019, 12:29
|
Интересующийся
|
|
Регистрация: 17.04.2018
Сообщений: 26
|
|
Сообщение от laimas
|
Все верно, ведь сравниваются строки. Производите сравнение рег. выражением, то есть по шаблону задаваемому значением в поле, где вместо пробела будет | - samsung|galaxy, тогда хоть так samsung|galaxy, хоть так galaxy|samsung, будет найдено все.
|
К сожалению я не знаю как это сделать, по этому и обратился за помощью. Если вы можете написать что на что заменить то буду очень благодарен
|
|
25.01.2019, 12:30
|
Интересующийся
|
|
Регистрация: 17.04.2018
Сообщений: 26
|
|
пока писал ответ не увидел что уже ответили )
|
|
25.01.2019, 12:32
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
рони, надо бы наверное trim() для входного значения, и \s более одного?
Видимо перепил, trim есть.
Последний раз редактировалось laimas, 25.01.2019 в 12:37.
|
|
|
|