Creating Dynamic filtering using JSON
Mon Dec 09 2024 21:19:55 GMT+0000 (Coordinated Universal Time)
Saved by @davidmchale
import data from "./data.json"; // this is the json data // the json data looks like this { "locations": { "brisbaneCityLibrary": { "name": "Brisbane City Library", "lat": -27.4710107, "lng": 153.0234489, "website": "https://www.brisbane.qld.gov.au/facilities-recreation/cultural/brisbane-city-library", "tel": "+61 7 3403 8888", "email": "library@brisbane.qld.gov.au", "category": "Library" }, "goldCoastCommunityCentre": { "name": "GoldCoast Community Centre", "lat": -28.016667, "lng": 153.399994, "website": "https://www.goldcoast.qld.gov.au/community/community-centres", "tel": "+61 7 5667 5973", "email": "community@goldcoast.qld.gov.au", "category": "Training" }, } (function () { "use strict"; // Variables const dummyData = data.locations; // this pulling the locations from the json data const checkboxesWrapper = document.querySelector(".checkers"); const list = document.querySelector(".filtered-list"); let filteredItems = []; let selectedCategories = []; // Get specific data needed from the API and return a new array of data function getListData(data) { if (!data) return []; return Object.entries(data).map(([index, item]) => ({ name: item.name, category: item.category, web: item.website, })); } // Generate HTML for each item function itemHTML({ name, category, web }) { return ` <li> <h3>${name}</h3> <p>Category: ${category}</p> <p>Website: <a href="${web}" target="_blank" rel="noopener noreferrer">${web}</a></p> </li>`; } // Generate HTML for checkboxes function checkboxHTML(category) { return ` <label> <input type="checkbox" class="filter-checkbox" name="checkbox" role="checkbox" value="${category}"/> ${category} </label>`; } // Display checkboxes in the DOM function displayCheckBoxes(array) { const data = getListData(array); console.log(data); const allCategories = data.map((item) => item.category).filter(Boolean); const categories = [...new Set(allCategories)]; // Remove duplicates and ret const checkBoxHTML = categories.map(checkboxHTML).join(""); checkboxesWrapper.innerHTML = checkBoxHTML; // Replace content } // Display items in the DOM function displayitems() { const itemData = getListData( filteredItems.length > 0 ? filteredItems : dummyData ); const listHTML = itemData.map(itemHTML).join(""); list.innerHTML = listHTML; // Replace content } // Check if a value exists in an array function isValueInArray(array, valueToCheck) { return array.some((item) => item === valueToCheck); } // Handle checkbox changes function onHandleCheck(box) { if (!box) return; box.addEventListener("change", function (e) { const { currentTarget } = e; const catValue = currentTarget.value.toLowerCase(); // Get the category value from the checkbox clicked const isChecked = currentTarget.checked; // Get true or false if the checkbox is clicked or not const isExisting = isValueInArray(selectedCategories, catValue); console.log({ catValue, isChecked, isExisting }); // Add to array if checked and not already existing if (isChecked && !isExisting) { selectedCategories.push(catValue); } // Remove if unchecked and category exists if (!isChecked && isExisting) { selectedCategories = selectedCategories.filter( (cat) => cat !== catValue ); } console.log({ selectedCategories }); // Filter items based on selected categories filteredItems = Object.values(dummyData).filter((item) => selectedCategories.includes(item.category.toLowerCase()) ); // Update the displayed items displayitems(); }); } // Initialize the application function init() { // Initially populate checkboxes based on all categories from dummyData displayCheckBoxes(dummyData); // Initially populate the list of items based on dummyData displayitems(); const domCheckBoxes = document.querySelectorAll(".filter-checkbox"); if (!domCheckBoxes) return; domCheckBoxes.forEach(onHandleCheck); } init(); })();
Using the 'category' from the json data to output a list of dynamic checkboxes and filtering out the items when a checkbox is clicked. If another category is added, then another checkbox will be created.
Comments