慕桂英4014372
要实现两个主要功能:取消选中类别时将其删除我建议您使用 Set as ,以便您可以分别通过 和 轻松检查、添加和删除条目。filters.categorieshasadddelete//onchange eventif (checkbox.checked) { filters.categories.add(event.target.value);} else { filters.categories.delete(event.target.value);}filterStores(stores, filters);也根据类别进行过滤stores将回调修改为帐户:.filterstore.name.toLowerCase().includes(filters.searchText.toLowerCase()) &&filters.categories.has(store.category.name.toLowerCase())此外,要在未选择任何类别时显示全部,请执行以下操作:store.name.toLowerCase().includes(filters.searchText.toLowerCase()) &&( filters.categories.has(store.category.name.toLowerCase()) || filters.categories.size === 0)一起:/*---------------------------- data----------------------------*/const stores = [{ id: 0, name: 'The Last Of Us', studio: 'Naughtydog', thumbnail: '', category: { id: 0, name: 'Playstation' }, price: 50.00}, { id: 1, name: 'Animal Crossing', studio: 'Nintendo', thumbnail: '', category: { id: 1, name: 'Nintendo' }, price: 60.00}, { id: 2, name: 'Gears 5', studio: 'The Coalition', thumbnail: '', category: { id: 2, name: 'Xbox' }, price: 10.00}, { id: 3, name: 'DOOM Eternal', studio: 'id Software', thumbnail: '', category: { id: 3, name: 'Playstation' }, price: 50.00}, { id: 4, name: 'The Legend of Zelda: Link\'s Awakening', studio: 'Grezzo', thumbnail: '', category: { id: 4, name: 'Nintendo' }, price: 35.00}, { id: 5, name: 'Resident Evil 3', studio: 'Capcom', thumbnail: '', category: { id: 5, name: 'Playstation' }, price: 40.00}];let filters = { searchText: '', categories: new Set}/*---------------------------- functions----------------------------*/let filterStores = function (stores, filters) { let filteredStores = stores.filter(store => ( store.name.toLowerCase().includes(filters.searchText.toLowerCase()) && ( filters.categories.has(store.category.name.toLowerCase()) || filters.categories.size === 0 //No selected categories, show all ) )); let grid = document.querySelector('.grid'); grid.innerHTML = ''; filteredStores.forEach(function (store) { let li = document.createElement('li'); li.textContent = store.name; grid.appendChild(li); });}/*---------------------------- events----------------------------*/document.addEventListener('DOMContentLoaded', function () { filterStores(stores, filters); document.querySelector('.store-search').addEventListener('input', function (event) { filters.searchText = event.target.value; filterStores(stores, filters); }); document.querySelectorAll('.category-cb').forEach(function (checkbox) { checkbox.addEventListener('change', function (event) { if (checkbox.checked) { filters.categories.add(event.target.value); } else { filters.categories.delete(event.target.value); } filterStores(stores, filters); }); });});<!DOCTYPE html><html><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title></head><body> <aside> <ul> <li> <label> <input type="checkbox" value="playstation" class="category-cb"> <span>Playstation</span> </label> </li> <li> <label> <input type="checkbox" value="xbox" class="category-cb"> <span>Xbox</span> </label> </li> <li> <label> <input type="checkbox" value="nintendo" class="category-cb"> <span>Nintendo</span> </label> </li> </ul> </aside> <main> <input type="text" class="store-search" placeholder="Search"> <ul class="grid"></ul> </main> <script src="app.js"></script></body></html>您还可以使用数组:/*---------------------------- data----------------------------*/const stores = [{ id: 0, name: 'The Last Of Us', studio: 'Naughtydog', thumbnail: '', category: { id: 0, name: 'Playstation' }, price: 50.00}, { id: 1, name: 'Animal Crossing', studio: 'Nintendo', thumbnail: '', category: { id: 1, name: 'Nintendo' }, price: 60.00}, { id: 2, name: 'Gears 5', studio: 'The Coalition', thumbnail: '', category: { id: 2, name: 'Xbox' }, price: 10.00}, { id: 3, name: 'DOOM Eternal', studio: 'id Software', thumbnail: '', category: { id: 3, name: 'Playstation' }, price: 50.00}, { id: 4, name: 'The Legend of Zelda: Link\'s Awakening', studio: 'Grezzo', thumbnail: '', category: { id: 4, name: 'Nintendo' }, price: 35.00}, { id: 5, name: 'Resident Evil 3', studio: 'Capcom', thumbnail: '', category: { id: 5, name: 'Playstation' }, price: 40.00}];let filters = { searchText: '', categories: []}/*---------------------------- functions----------------------------*/let filterStores = function (stores, filters) { let filteredStores = stores.filter(store => ( store.name.toLowerCase().includes(filters.searchText.toLowerCase()) && ( filters.categories.includes(store.category.name.toLowerCase()) || filters.categories.length === 0 //No selected categories, show all ) )); let grid = document.querySelector('.grid'); grid.innerHTML = ''; filteredStores.forEach(function (store) { let li = document.createElement('li'); li.textContent = store.name; grid.appendChild(li); });}/*---------------------------- events----------------------------*/document.addEventListener('DOMContentLoaded', function () { filterStores(stores, filters); document.querySelector('.store-search').addEventListener('input', function (event) { filters.searchText = event.target.value; filterStores(stores, filters); }); document.querySelectorAll('.category-cb').forEach(function (checkbox) { checkbox.addEventListener('change', function (event) { if (checkbox.checked) { filters.categories.push(event.target.value); } else { filters.categories.splice(filters.categories.indexOf(event.target.value), 1); } filterStores(stores, filters); }); });});<!DOCTYPE html><html><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title></head><body> <aside> <ul> <li> <label> <input type="checkbox" value="playstation" class="category-cb"> <span>Playstation</span> </label> </li> <li> <label> <input type="checkbox" value="xbox" class="category-cb"> <span>Xbox</span> </label> </li> <li> <label> <input type="checkbox" value="nintendo" class="category-cb"> <span>Nintendo</span> </label> </li> </ul> </aside> <main> <input type="text" class="store-search" placeholder="Search"> <ul class="grid"></ul> </main> <script src="app.js"></script></body></html>