Как реализовать фильтрацию товаров на чистом JS?

Что на данный момент у меня есть:
1) я сверстал фильтры:
  • а) фильтр по списку
  • б) фильтр по чекбоксам
  • в) фильтр по цене с ползунком и инпутами

2) есть файл json где хранятся четыре товары (объекты)
3) есть JS файл который выводит эти товары на страницу

Вот как сейчас это выглядит:
5d63af2e24566541849830.jpeg

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

А вот код того что есть:
HTML:
<div id="filters">
     <div class="country"><h2>Country</h2>
       <select id="country">
       <option value="hide">-- Country --</option>
       <option value="turkey">Turkey</option>
       <option value="china">China</option>
       <option value="france">France</option>
       <option value="italy">Italy</option>   
       </select>     
     </div>
    
      <div class="size"><h2>Size</h2>
      <div id="myDropdown">
        <input type="checkbox" class="btn" value="S">S<br>
        <input type="checkbox" class="btn" value="M"> M<br>
        <input type="checkbox" class="btn" value="L"> L<br>
        <input type="checkbox" class="btn" value="XL"> XL<br>
      </div>
      </div>
      
     <div class="price"><h2>Price</h2>
       <div class="price-input"><input class="input-text" type="text"  value="">&nbsp;-&nbsp;</div>
       <div class="price-input"><input class="input-text" type="text"  value="">&nbsp;usd&nbsp;</div>
       <button id="submitprice" type="submit">OK</button>
          <input type="range" min="1" max="100" value="50">
    </div>
</div>
           
<div id="goods"></div>

<script>var sex = 'male'</script>


JS:
document.addEventListener('DOMContentLoaded', function (e) {               
  loadGoods();
});

function loadGoods() {
    $.getJSON('goods.json', function (data) {
        var out = '';
        for (var key in data){
            if (data[key]['sex'] != sex) { continue; } 
            out+='<div class="single-goods">';
            out+='<h3>'+data[key]['name']+'</h3>';
            out+='<img src="'+data[key].image+'">';
            out+='<p>Цена: '+data[key]['cost']+'</p>';
            out+='<button class="add-to-cart" data-art="'+key+'">Купить</button>';
            out+='</div>';
        }
         document.getElementById('goods').innerHTML = out; 
    });
}


JSON:
{
  "Рубашка №1" : {
      "sex" : "male",
    "name" : "Рубашка №1",
    "cost" : 1000,
    "country" : "argentina",
    "image" : "http://i.piccy.info/i9/9921ed03bf45751d45447b15e78be751/1566814909/19890/1334636/1.jpg",
    "size": "S"
  },
  "Рубашка №2" : {
      "sex" : "male",
    "name" : "Рубашка №2",
    "cost" : 1200,
    "country" : "argentina",
    "image" : "http://i.piccy.info/i9/acc4df9b14e48a42d7cd353e923673e7/1566814962/22015/1334636/2.jpg",
    "size": "M"
  },
  "Рубашка №3" : {
      "sex" : "male",
    "name" : "Рубашка №3",
    "cost" : 1700,
    "country" : "argentina",
    "image" : "http://i.piccy.info/i9/174610be67bfea39f99c956885ae3786/1566815027/25896/1334636/3.jpg",
    "size": "L"
  },
"Рубашка №4" : {
    "sex" : "male",
    "name" : "Рубашка №4",
    "cost" : 2000,
    "country" : "argentina",
    "image" : "http://i.piccy.info/i9/e2e5c6cb274121b9898b7d45a085130f/1566815049/29582/1334636/4.jpg",
     "size": "XL"
  }
}


СSS:
#filters{
    width: 200px;
    height: 800px;
    border: 1px solid black;
    float:left;
    margin: 0;
}
.price-input{
    float:left;
}
.input-text{
    width: 50px;
   
}
.single-goods {
    width: 280px;
    height: 530px;
    border: 1px solid black;
    margin: 10px;
    float: left;
    text-align: center;
}
  • Вопрос задан
  • 10091 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Данные - вместо объекта сделайте массив, так будет проще работать.

Когда данные получили - сохраните их (ну типа переменная какая-то, чтобы они у вас всегда были под рукой).

Сделайте функцию, которая будет выводить список товаров - но не весь, а те, что ей будут переданы.

Сделайте функцию, которая будет осуществлять фильтрацию - получает значения из фильтров, отбирает соответствующие элементы из массива, результат передаёт в функцию вывода товаров.

На блок с фильтрами вешаете функцию фильтрации в качестве обработчика событий, возникающих после взаимодействия пользователя с фильтрами.

Всё.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы