Product filter by price min and max example with jQuery

Doing a min and max price product filtering for items using javascript/jQuery.

product price min max filter example html javascript

This is very similar to the size filtering post, however instead of checkboxes, it is 2 range sliders for a minimum and maximum price value.

CodePen example.

Start by defining a default min and max price value and loading in all the items in the grid unfiltered:

let min_price = 0;
let max_price = 100;

$(document).ready(function () {
    showAllItems();//Display all items with no filter applied
});

The default max price should be equal to or higher than the highest-priced item.

Next is to catch and make changes when the range sliders are moved/interacted with.

Get the value as an integer, apply it to a span text as a visual guide and then use the new min or max value with the item filter.

$('#min-price').on("change mousemove", function () {
    min_price = parseInt($('#min-price').val());//Get the value
    $('#min-price-txt').text('$' + min_price);//Set the value
    showItemsFiltered();//Apply the filter
});

The showItemsFiltered() function with the conditions for the price min and max filtering applied:

function showItemsFiltered() {//Default grid to show all items on page load in
    $("#display-items-div").empty();
    for (let i = 0; i < category_items.length; i++) {//Go through the items but only show items that have size from show_sizes_array
        if (category_items[i]['price'] <= max_price && category_items[i]['price'] >= min_price) {
            let item_content = '<div class="col-12 col-md-4 text-center product-card" data-available-sizes="' + category_items[i]['sizes'] + '"><b>' + category_items[i]['title'] + '</b><br><img src="' + category_items[i]['thumbnail'] + '" height="64" width="64" alt="shoe thumbnail"><p>$' + category_items[i]['price'] + '</p></div>';
            $("#display-items-div").append(item_content);//Display in grid
        }
    }
}

The full Javascript

let min_price = 0;
let max_price = 100;

$(document).ready(function () {
    showAllItems();//Display all items with no filter applied
});

$('#min-price').on("change mousemove", function () {
    min_price = parseInt($('#min-price').val());
    $('#min-price-txt').text('$' + min_price);
    showItemsFiltered();
});

$('#max-price').on("change mousemove", function () {
    max_price = parseInt($('#max-price').val());
    $('#max-price-txt').text('$' + max_price);
    showItemsFiltered();
});

let category_items = [
    {
        "id": 1,
        "category_id": 8,
        "price": 39.42,
        "title": "Shoes with id #1",
        "thumbnail": "https://www.transparentpng.com/download/adidas-shoes/a4xO3G-adidas-shoes-adidas-shoe-kids-superstar-daddy-grade.png",
        "sizes": [
            "US-MEN-10",
            "US-MEN-11"
        ]
    },
    {
        "id": 2,
        "category_id": 8,
        "price": 31.93,
        "title": "Shoes with id #2",
        "thumbnail": "https://www.transparentpng.com/download/adidas-shoes/a4xO3G-adidas-shoes-adidas-shoe-kids-superstar-daddy-grade.png",
        "sizes": [
            "US-MEN-13"
        ]
    },
    {
        "id": 3,
        "category_id": 8,
        "price": 49.44,
        "title": "Shoes with id #3",
        "thumbnail": "https://www.transparentpng.com/download/adidas-shoes/a4xO3G-adidas-shoes-adidas-shoe-kids-superstar-daddy-grade.png",
        "sizes": [
            "US-MEN-14"
        ]
    },
    {
        "id": 4,
        "category_id": 58,
        "price": 65.38,
        "title": "Shoes with id #4",
        "thumbnail": "https://www.transparentpng.com/download/adidas-shoes/a4xO3G-adidas-shoes-adidas-shoe-kids-superstar-daddy-grade.png",
        "sizes": [
            "US-MEN-13"
        ]
    },
    {
        "id": 5,
        "category_id": 8,
        "price": 27.21,
        "title": "Shoes with id #5",
        "thumbnail": "https://www.transparentpng.com/download/adidas-shoes/a4xO3G-adidas-shoes-adidas-shoe-kids-superstar-daddy-grade.png",
        "sizes": [
            "US-MEN-9",
            "US-MEN-8",
            "US-MEN-10",
            "US-MEN-11",
            "US-MEN-12"
        ]
    },
    {
        "id": 6,
        "category_id": 8,
        "price": 73.05,
        "title": "Shoes with id #6",
        "thumbnail": "https://www.transparentpng.com/download/adidas-shoes/a4xO3G-adidas-shoes-adidas-shoe-kids-superstar-daddy-grade.png",
        "sizes": [
            "US-MEN-9",
            "US-MEN-8",
            "US-MEN-10",
            "US-MEN-11",
            "US-MEN-12",
            "US-MEN-13"
        ]
    },
    {
        "id": 7,
        "category_id": 8,
        "price": 51.96,
        "title": "Shoes with id #7",
        "thumbnail": "https://www.transparentpng.com/download/adidas-shoes/a4xO3G-adidas-shoes-adidas-shoe-kids-superstar-daddy-grade.png",
        "sizes": [
            "US-MEN-9",
            "US-MEN-8",
            "US-MEN-10",
            "US-MEN-11"
        ]
    },
    {
        "id": 8,
        "category_id": 8,
        "price": 29.35,
        "title": "Shoes with id #8",
        "thumbnail": "https://www.transparentpng.com/download/adidas-shoes/a4xO3G-adidas-shoes-adidas-shoe-kids-superstar-daddy-grade.png",
        "sizes": [
            "US-MEN-11",
            "US-MEN-12",
            "US-MEN-13"
        ]
    },
    {
        "id": 9,
        "category_id": 8,
        "price": 80.00,
        "title": "Shoes with id #9",
        "thumbnail": "https://www.transparentpng.com/download/adidas-shoes/a4xO3G-adidas-shoes-adidas-shoe-kids-superstar-daddy-grade.png",
        "sizes": [
            "US-MEN-9",
            "US-MEN-8",
            "US-MEN-10",
            "US-MEN-11"
        ]
    },
    {
        "id": 10,
        "category_id": 8,
        "price": 70.07,
        "title": "Shoes with id #10",
        "thumbnail": "https://www.transparentpng.com/download/adidas-shoes/a4xO3G-adidas-shoes-adidas-shoe-kids-superstar-daddy-grade.png",
        "sizes": [
            "US-MEN-9",
            "US-MEN-8",
            "US-MEN-10"
        ]
    },
    {
        "id": 11,
        "category_id": 8,
        "price": 79.37,
        "title": "Shoes with id #11",
        "thumbnail": "https://www.transparentpng.com/download/adidas-shoes/a4xO3G-adidas-shoes-adidas-shoe-kids-superstar-daddy-grade.png",
        "sizes": [
            "US-MEN-9",
            "US-MEN-8",
            "US-MEN-10",
            "US-MEN-11",
            "US-MEN-12"
        ]
    },
    {
        "id": 12,
        "category_id": 8,
        "price": 27.14,
        "title": "Shoes with id #12",
        "thumbnail": "https://www.transparentpng.com/download/adidas-shoes/a4xO3G-adidas-shoes-adidas-shoe-kids-superstar-daddy-grade.png",
        "sizes": [
            "US-MEN-9",
            "US-MEN-8",
            "US-MEN-10",
            "US-MEN-11"
        ]
    }
]

function showAllItems() {//Default grid to show all items on page load in
    $("#display-items-div").empty();
    for (let i = 0; i < category_items.length; i++) {
        let item_content = '<div class="col-12 col-md-4 text-center product-card" data-available-sizes="' + category_items[i]['sizes'] + '"><b>' + category_items[i]['title'] + '</b><br><img src="' + category_items[i]['thumbnail'] + '" height="64" width="64" alt="shoe thumbnail"><p>$' + category_items[i]['price'] + '</p></div>';
        $("#display-items-div").append(item_content);
    }
}

function showItemsFiltered() {//Default grid to show all items on page load in
    $("#display-items-div").empty();
    for (let i = 0; i < category_items.length; i++) {//Go through the items but only show items that have size from show_sizes_array
        if (category_items[i]['price'] <= max_price && category_items[i]['price'] >= min_price) {
            let item_content = '<div class="col-12 col-md-4 text-center product-card" data-available-sizes="' + category_items[i]['sizes'] + '"><b>' + category_items[i]['title'] + '</b><br><img src="' + category_items[i]['thumbnail'] + '" height="64" width="64" alt="shoe thumbnail"><p>$' + category_items[i]['price'] + '</p></div>';
            $("#display-items-div").append(item_content);//Display in grid
        }
    }
}

Full HTML

<div class="container">
  <div class="row">
    <div class=" col-12 col-md-2">
      <div class="card px-2">
        <h2 class="text-center">Filter by</h2>
        <hr>
        <h4>Price:</h4>
        <div class="card-body">
          <form id="price-range-form">
            <label for="min-price" class="form-label">Min price: </label>
            <span id="min-price-txt">$0</span>
            <input type="range" class="form-range" min="0" max="99" id="min-price" step="1" value="0">
            <label for="max-price" class="form-label">Max price: </label>
            <span id="max-price-txt">$100</span>
            <input type="range" class="form-range" min="1" max="100" id="max-price" step="1" value="100">
          </form>
        </div>
      </div>
    </div>
    <div class="col-12 col-md-10">
      <div class="card">
        <div class="card-body">
          <div class="row" id="display-items-div">

          </div>
        </div>
      </div>
    </div>
  </div>
</div>