элемент select не возвращает при выборе "все" полный массив элементов JS

Проблема в коде такова: я не могу придумать, как вернуть все элементы, когда выбрана опция "все" Буду очень признателен за любую помощь

 <div class="filter-box">
                <div class="select-box">
                    <label class="filter-label">Категория</label>
                    <select id="cats" class="select-control">
                        <option value="0">Все</option>
                        <option value="1">Завтраки</option>
                        <option  value="2">Первые блюда</option>
                        <option  value="3">Гарниры</option>
                    </select>
                </div>
                <div class="price-select-box">
                    <label class="filter-label">Цена</label>
                    <select id="price" class="select-control">
                        <option value="0">Все</option>
                        <option value="30">До 30 грн</option>
                        <option value="50">До 50 грн</option>
                        <option value="100">До 100 грн</option>
                        <option value="150">До 150 грн</option>
                    </select>
                </div>
            </div>
            <div id="products" class="products-box grid-box "> </div>

const products = document.getElementById("products");
    const catsSel = document.getElementById("cats");
    const priceSel = document.getElementById("price");
    document.addEventListener('change', handleChange)
    function handleChange(e) {
      const {target} = e;
      if(target.id !== "cats" && target.id !== "price") {
      return;
    }
    const selectedCat = parseInt(catsSel.value)
    const selectedPrice = parseInt(priceSel.value)
    const data = defaultData.products.filter((item) => {
      return (
        (selectedCat === -1 || item.cid === selectedCat) &&
        (selectedPrice === -1 || item.price <= selectedPrice) 
      )
    })
    if (data.length !== 0) { render(data) } 
    }
function render(data) { document.getElementById("products").innerHTML += data[0].i; }




 var defaultData = {
        cats: [
          { id: 1, title: "Все" },
          { id: 2, title: "Завтраки" },
          { id: 3, title: "Первые блюда" },
          { id: 4, title: "Гарниры" }
        ],
        products: [
          {
            id: 1,
            cid: 1,
            title: "Овсяная каша с фруктами",
            im: "<img class='img-fluid' src='i/im1.jpg'>",
            price: 30
          },
          {
            id: 2,
            cid: 1,
            title: "Яичница глазунья с овощами на сковородке",
            im: "<img class='img-fluid' src='i/im2.jpg'>",
            price: 25
          },
          {
            id: 3,
            cid: 1,
            title: "Сет азербайджанский завтрак",
            im: "<img class='img-fluid' src='i/im3.jpg'>",
            price: 10
          },
          {
            id: 4,
            cid: 4,
            title: "Яичница с помидорами по-бакински",
            im: "<img class='img-fluid' src='i/im4.jpg'>",
            price: 28
          },
          { id: 5, cid: 1, title: "Сырники со сметаной", im: "<img class='img-fluid' src='i/im5.jpg'>", price: 50},
          { id: 6, cid: 2, title: "Шпинатный крем-суп", im: "<img class='img-fluid' src='i/im6.jpg'>", price: 60},
          { id: 7, cid: 2, title: "Суп Пити", im: "<img class='img-fluid' src='i/im7.jpg'>", price: 118},
          { id: 8, cid: 2, title: "Борщ украинский", im: "<img class='img-fluid' src='i/im8.jpg'>", price: 68},
          { id: 9, cid: 2, title: "Суп Кюфта Бозбаш", im: "<img class='img-fluid' src='i/im9.jpg'>", price: 145},
          {
            id: 10,
            cid: 2,
            title: "Суп Соютма из ягненка",
            im: "<img class='img-fluid' src='i/im10.jpg'>",
            price: 150
          },
          { id: 11, cid: 3, title: "Картофель фри", im: "<img class='img-fluid' src='i/im11.jpg'>", price: 35 },
          {
            id: 12,
            cid: 3,
            title: "Картофель по-домашнему",
            im: "<img class='img-fluid' src='i/im12.jpg'>",
            price: 45
          }
        ],
      };
      
      var renderCats = defaultData.cats.reduce((acc, item) => {
        acc[item.id] = item;
        return acc;
      }, {});

полный пример не работающего кода ) https://codesandbox.io/s/affectionate-albattani-s0snm?file=/src/index.js


Ответы (1 шт):

Автор решения: yar85

Выражения в коллбэке filter неправильные - предполагается value <= 0 || .... вместо value === -1 || .....

const defaultData = getDefaultData(), 
      products = document.getElementById("products"), 
      catsSel = document.getElementById("cats"), 
      priceSel = document.getElementById("price");
document.addEventListener('change', handleChange); 
render(defaultData.products); 

function handleChange({ target }) {
  if ((target.id !== 'cats') && (target.id !== 'price')) return;
  const selectedCat = +catsSel.value, 
        selectedPrice = +priceSel.value; 
  render(defaultData.products.filter(item => (
    (selectedCat <= 0 || item.cid === selectedCat) &&
    (selectedPrice <= 0 || item.price <= selectedPrice)
  )));
}

function render(data) {
  products.innerHTML = data.map(item => `<div>
    <span class="title">${item.title}</span>
    ${item.im}
    <span class="price">${item.price}</span>
  </div>`).join('');
}


function getDefaultData() {
  return {
    cats: [
      { id: 1, title: "Все" },
      { id: 2, title: "Завтраки" },
      { id: 3, title: "Первые блюда" },
      { id: 4, title: "Гарниры" }, 
    ],
    products: [
      {
        id: 1,
        cid: 1,
        title: "Овсяная каша с фруктами",
        im: '<img class="img-fluid" src="https://loremflickr.com/64/64/cat?r=1">',
        price: 30
      }, {
        id: 2,
        cid: 1,
        title: "Яичница глазунья с овощами на сковородке",
        im: '<img class="img-fluid" src="https://loremflickr.com/64/64/cat?r=2">',
        price: 25
      }, {
        id: 3,
        cid: 1,
        title: "Сет азербайджанский завтрак",
        im: '<img class="img-fluid" src="https://loremflickr.com/64/64/cat?r=3">',
        price: 10
      }, {
        id: 4,
        cid: 4,
        title: "Яичница с помидорами по-бакински",
        im: '<img class="img-fluid" src="https://loremflickr.com/64/64/cat?r=4">',
        price: 28
      }, {
        id: 5,
        cid: 1,
        title: "Сырники со сметаной",
        im: '<img class="img-fluid" src="https://loremflickr.com/64/64/cat?r=5">',
        price: 50
      }, {
        id: 6,
        cid: 2,
        title: "Шпинатный крем-суп",
        im: '<img class="img-fluid" src="https://loremflickr.com/64/64/cat?r=6">',
        price: 60
      }, {
        id: 7,
        cid: 2,
        title: "Суп Пити",
        im: '<img class="img-fluid" src="https://loremflickr.com/64/64/cat?r=7">',
        price: 118
      }, {
        id: 8,
        cid: 2,
        title: "Борщ украинский",
        im: '<img class="img-fluid" src="https://loremflickr.com/64/64/cat?r=8">',
        price: 68
      }, {
        id: 9,
        cid: 2,
        title: "Суп Кюфта Бозбаш",
        im: '<img class="img-fluid" src="https://loremflickr.com/64/64/cat?r=9">',
        price: 145
      }, {
        id: 10,
        cid: 2,
        title: "Суп Соютма из ягненка",
        im: '<img class="img-fluid" src="https://loremflickr.com/64/64/cat?r=10">',
        price: 150
      }, {
        id: 11,
        cid: 3,
        title: "Картофель фри",
        im: '<img class="img-fluid" src="https://loremflickr.com/64/64/cat?r=11">',
        price: 35
      }, {
        id: 12,
        cid: 3,
        title: "Картофель по-домашнему",
        im: '<img class="img-fluid" src="https://loremflickr.com/64/64/cat?r=12">',
        price: 45
      },
    ],
  };
}
#products { margin: 1rem 0; }
#products > div { display: flex; align-items: center; max-width: 500px; padding: 0.2rem; border: 1px solid #ccc; }
#products > div + div { border-top: 0; }
#products > div .title { flex: 1 1; }
#products > div .price { min-width: 6ch; text-align: right; }
#products > div .price::after { content: '?'; }
<div class="filter-box">
  <div class="select-box">
    <label class="filter-label">Категория</label>
    <select id="cats" class="select-control">
      <option value="0">Все</option>
      <option value="1">Завтраки</option>
      <option value="2">Первые блюда</option>
      <option value="3">Гарниры</option>
    </select>
  </div>
  <div class="price-select-box">
    <label class="filter-label">Цена</label>
    <select id="price" class="select-control">
      <option value="0">Все</option>
      <option value="30">До 30 ?</option>
      <option value="50">До 50 ?</option>
      <option value="100">До 100 ?</option>
      <option value="150">До 150 ?</option>
    </select>
  </div>
</div>
<div id="products" class="products-box grid-box"></div>

→ Ссылка