Вопрос состоит в том как правильно организовать фильтр на стороне клиента

187
17 августа 2018, 21:30

Как правильно организовать фильтр для выбора бренда и цены?

<div class="wrapper"> 
  <h3>Фильтр</h3> 
</div> 
 
<hr> 
 
<h3>Каталог</h3> 
<div class="catalog"> 
  <div>Lenovo цена 8000</div> 
  <div>Asus цена 8000</div> 
  <div>MSI цена 20000</div> 
  <div>Asus цена 15000</div> 
  <div>Asus цена 9000</div> 
  <div>HP цена 17000</div> 
</div>

Answer 1

Как правильно организовать фильтр для выбора бренда и цены?

Не самый оптимальный вариант, но все же.

var products = [{ 
    name: "HP", 
    price: 8000 
  }, 
  { 
    name: "Asus", 
    price: 8000 
  }, 
  { 
    name: "MSI", 
    price: 20000 
  }, 
  { 
    name: "Asus", 
    price: 15000 
  }, 
  { 
    name: "Asus", 
    price: 9000 
  }, 
  { 
    name: "HP", 
    price: 17000 
  }, 
] 
//---------------------------------------------------------------- 
var unq = [] // Только наименование 
// Оставляет массив продуктов 
unq = products.map(item => item.name) 
  .filter((value, index, self) => self.indexOf(value) === index) 
 
var sel = $('select') 
var cat = $('.catalog') 
// Селект из уникальных продуктов 
$.each(unq, function(i, p) { 
  sel.append('<option value="' + p + '">' + p + '</option>') 
}) 
// Построение каталога из всех продуктов 
$.each(products, function(i, p) { 
  // Создание нового элемента для продукта 
  let div = $('<div/>') 
    .attr({ 
      class: 'item', 
      "data-prod-name": p.name, 
      "data-price": p.price 
    }) 
    .text(p.name + ' цена ' + p.price); 
  cat.append(div); 
}) 
 
// Если есть изменения в селекте 
sel.on('change', function(e) { 
  var filter = $(this).val() 
  //---------------------------------------------------------------- 
  cat.children().each(function(i) { 
    if (filter !== "All" && filter !== $(this).attr('data-prod-name')) { 
      $(this).hide() 
    } else { 
      $(this).show() 
    } 
 
  }) 
}) 
 
//---------------------------------------------------------------- 
// Филтр по цене 
$('.price').keypress(function(e) { 
  if (e.which == 13) { 
    var val = $(this).val() 
    cat.children().each(function(i) { 
      //-------------------------------------------- 
      // Mathjs вроде они лучше, чем обычный eval.. 
      //-------------------------------------------- 
      if (!math.eval($(this).attr('data-price') + val)) { 
        $(this).hide() 
      } else if (val.length === 0) { 
        // Фильтрует только в случае Only if nothing was filtered 
        // когда была предыдущая фильтрация 
        // Выбор из селекта 
        sel.trigger('change') 
      } else { 
        $(this).show() 
      } 
    }) 
  } 
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/5.0.1/math.min.js"></script> 
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<select name="" id=""> 
  <option value="All">All</option> 
</select> 
 
<input type="text" class="price" name="byprice" placeholder="filter by price" title="Filter by: &gt; | &gt;&equals; | &lt; | &lt;&equals; | &equals;&equals; | &equals;&equals;8000 [Enter]"> 
<span>Filter by: &gt; | &gt;&equals; | &lt; | &lt;&equals; | &equals;&equals; | &equals;&equals;8000 [Enter]</span> 
<hr> 
<h1>Каталог</h1> 
<div class="catalog"> 
 
</div> 
<hr>

P.S.: На весь экран.

READ ALSO
Как работает Select

Как работает Select

Мне непонятен фрагментSelect(n => Convert

184
Свойства интерфейсов С#

Свойства интерфейсов С#

Есть простая структура:

193
Дать каждому файлу рандомное имя

Дать каждому файлу рандомное имя

Создал массив с путями до файлов и создал коллекцию в которую поместил массивДалее написал цикл, который копирует содержимое файлов и дает...

170
Unity. Сцена стала долго грузиться

Unity. Сцена стала долго грузиться

Всем привет! Проблема такая: 18 июня у меня сцена в мобильной игре грузилась за 1-2 секунды, а вот 30 июня сцена стала грузиться 5-6-7 секундКод почти...

152