javascript - 过滤掉并动态更改附加结果?
问题描述
我将尝试尽可能简单地解释这一点。
我有一个来自对象的数据列表,如下所示:
let burgers = [
{
"storeSpace": "Open Space",
"storeName": "Five Guys",
"storeImage": "images/burgers/five-guys.png",
"storeLocation": "865 York Mills Rd, North York, ON M3B 1Y6",
"storeHours": "Hours: 11:00AM - 10:00PM"
},
{
"storeSpace": "Crowded",
"storeName": "Rudy",
"storeImage": "images/burgers/rudy.png",
"storeLocation": "619 College St, Toronto, ON M6G 1B5",
"storeHours": "Hours: 11:00AM - 10:00PM"
},
{
"storeSpace": "Crowded",
"storeName": "The Burger's Priest",
"storeImage": "images/burgers/burger-priest.png",
"storeLocation": "463 Queen St W, Toronto, ON M5V 2A9",
"storeHours": "Hours: 11:00AM - 10:00PM",
"pricing": true
},
{
"storeSpace": "Open Space",
"storeName": "Le Swan",
"storeImage": "images/burgers/le-swan.png",
"storeLocation": "892 Queen St W, Toronto, ON M6J 1G3",
"storeHours": "Hours: 11:00AM - 10:00PM",
"pricing": true
},
{
"storeSpace": "Open Space",
"storeName": "Le Swan",
"storeImage": "images/burgers/le-swan.png",
"storeLocation": "892 Queen St W, Toronto, ON M6J 1G3",
"storeHours": "Hours: 11:00AM - 10:00PM"
}
]
并且该信息通过如下所示的空 html 字符串显示:
var html = '';
function displayItems(obj, parent){
var uniqueID = 0;
obj.forEach(function(val){
html += '<div class="food-section" onclick="compareModule(\'compare-food-gui\')" compare_id=' + uniqueID + '>';
html += '<div class="food-thumb">';
html += '<img src="'+ val.storeImage +'" width="168" height="112"/>';
html += '</div>';
html += '<div class="food-info" compare_id=' + uniqueID + '>';
html += '<p class="store-capacity">'+ val.storeSpace +'</p>';
html += '<img src="images/star-filled.png" height="17" width="17" class="store-rating"/>';
html += '<img src="images/star-filled.png" height="17" width="17" class="store-rating"/>';
html += '<img src="images/star-filled.png" height="17" width="17" class="store-rating"/>';
html += '<img src="images/star-filled.png" height="17" width="17" class="store-rating"/>';
html += '<img src="images/star-unfilled.png" height="17" width="17" class="store-rating"/>';
html += '<p id="store-name" compare_id=' + uniqueID + '>'+ val.storeName +'</p>';
html += '<p class="store-desc" compare_id=' + uniqueID + '>'+ val.storeLocation +'</p>';
html += ' <p class="store-desc">Hours: 11:00AM - 10:00PM</p>';
html += '</div>';
html += '</div>';
});
let div = document.createElement('div');
div.classList.add('cart-item');
div.innerHTML = html;
document.getElementById(parent).appendChild(div);
}
displayItems(burgers,"burgers");
现在我有一个过滤器检查按钮列表,当我单击一个特定的按钮时,我想动态返回一个新的项目列表并实时运行。
这些按钮以图形方式看起来像:https ://imgur.com/a/CJ7deAM
代码是
<div class="filter-panel" id="filter-trigger">
<h1>Pricing</h1>
<label class="container"> Under $5.00
<input type="checkbox" id="under5" onclick="displayItems(burgers,'burgers', 'underfive')">
<span class="checkmark"></span>
</label>
<label class="container"> $5.00 - $27.00
<input type="checkbox" id="fiveto27" onclick="fiveToTwentySeven(burgers,'burgers')">
<span class="checkmark"></span>
</label>
<label class="container"> Over $27.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<h1>Portion Size</h1>
<label class="container"> Under $5.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<label class="container"> $5.00 - $27.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<label class="container"> Over $27.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<h1>Rating</h1>
<label class="container"> Under $5.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<label class="container"> $5.00 - $27.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<label class="container"> Over $27.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<button id="filterBtn" class="confirm-btn-large">Show all 35 stores</button>
</div>
我尝试了许多不同的方法,但没有得到正确的结果。我怎样才能实现我的要求?我希望根据单击要过滤的选项来简单地更新结果。
以图形方式显示结果的图像:https ://i.imgur.com/LpCHaPJ.png
更新:(我尝试过但没有帮助):
function displayItems(obj, parent, t){
var t = t;
if(obj[y].pricing === t){
所以我设置它来检查定价是否等于 t 类型意味着一种过滤器选项。在这种情况下,“五岁以下”的意思是,低于 5 美元的物品。
接下来,我在其中一个项目中的对象中添加了 ""pricing": "overfive""。
然后在html中,我添加了
onclick="displayItems(burgers,'burgers', 'underfive')">
那是在过滤器按钮旁边,如果我点击它;它确实会相应地过滤掉结果,但是我将如何为每一次更改进行管理?
我将不得不为 html 结果编写重复的代码大约 10 次。所以我知道这不是正确的解决方案。
就像我很确定我不应该写
if(x = 1){ 复制粘贴结果代码 }
else if(x = 2){ 复制粘贴结果代码 }
等等等等。我想要一个可以动态执行的功能。
解决方案
您需要为每个汉堡项目提供价格、评级和大小属性,以便可以将其过滤掉。
需要一个全局filters
对象/数据来跟踪您的过滤器。根据您的代码段,您的渲染功能已被修改为过滤汉堡(如果有任何过滤器),并且在渲染burgers
元素之前它需要清除之前的所有内容。
单击复选框时,它将更改全局filters
对象并调用渲染函数。
let burgers = [
{
"storeSpace": "Open Space",
"storeName": "Five Guys",
"storeImage": "https://www.seriouseats.com/recipes/images/2015/07/20150702-sous-vide-hamburger-anova-primary-1500x1125.jpg",
"storeLocation": "865 York Mills Rd, North York, ON M3B 1Y6",
"storeHours": "Hours: 11:00AM - 10:00PM",
"price": "underfive"
},
{
"storeSpace": "Crowded",
"storeName": "Rudy",
"storeImage": "images/burgers/rudy.png",
"storeLocation": "619 College St, Toronto, ON M6G 1B5",
"storeHours": "Hours: 11:00AM - 10:00PM",
"price":"fiveToTwentySeven"
},
{
"storeSpace": "Crowded",
"storeName": "The Burger's Priest",
"storeImage": "images/burgers/burger-priest.png",
"storeLocation": "463 Queen St W, Toronto, ON M5V 2A9",
"storeHours": "Hours: 11:00AM - 10:00PM",
"pricing": true
},
{
"storeSpace": "Open Space",
"storeName": "Le Swan",
"storeImage": "images/burgers/le-swan.png",
"storeLocation": "892 Queen St W, Toronto, ON M6J 1G3",
"storeHours": "Hours: 11:00AM - 10:00PM",
"pricing": true
},
{
"storeSpace": "Open Space",
"storeName": "Le Swan",
"storeImage": "images/burgers/le-swan.png",
"storeLocation": "892 Queen St W, Toronto, ON M6J 1G3",
"storeHours": "Hours: 11:00AM - 10:00PM"
}
]
// a global filter variable
var filters = {
price: [],
size: [],
rating: []
}
function changefilter(type,value, checked){
// if checked changes
// if checked == true add to global filter object
// else remove from global filter object
if(checked) filters[type].push(value)
else filters[type].splice(filters[type].indexOf(value),1)
displayItems(burgers,"burgers",filters)
}
function displayItems(obj, parent, myfilter){
// if filter exists then filter the burgers first
var filteredBurgers = obj.filter(burger =>
Object.keys(myfilter).every(
key => myfilter[key].length === 0 || myfilter[key].includes(burger[key])
)
)
// clear conents of parent element before rendering item
document.getElementById(parent).innerHTML = ''
var html = '';
var uniqueID = 0;
filteredBurgers.forEach(function(val){
html += '<div class="food-section" onclick="compareModule(\'compare-food-gui\')" compare_id=' + uniqueID + '>';
html += '<div class="food-thumb">';
html += '<img src="'+ val.storeImage +'" width="168" height="112"/>';
html += '</div>';
html += '<div class="food-info" compare_id=' + uniqueID + '>';
html += '<p class="store-capacity">'+ val.storeSpace +'</p>';
html += '<img src="images/star-filled.png" height="17" width="17" class="store-rating"/>';
html += '<img src="images/star-filled.png" height="17" width="17" class="store-rating"/>';
html += '<img src="images/star-filled.png" height="17" width="17" class="store-rating"/>';
html += '<img src="images/star-filled.png" height="17" width="17" class="store-rating"/>';
html += '<img src="images/star-unfilled.png" height="17" width="17" class="store-rating"/>';
html += '<p id="store-name" compare_id=' + uniqueID + '>'+ val.storeName +'</p>';
html += '<p class="store-desc" compare_id=' + uniqueID + '>'+ val.storeLocation +'</p>';
html += ' <p class="store-desc">Hours: 11:00AM - 10:00PM</p>';
html += '</div>';
html += '</div>';
});
let div = document.createElement('div');
div.classList.add('cart-item');
div.innerHTML = html;
document.getElementById(parent).appendChild(div);
}
displayItems(burgers,"burgers", filters);
<div class="filter-panel" id="filter-trigger">
<h1>Pricing</h1>
<label class="container"> Under $5.00
<input type="checkbox" id="under5" onchange="changefilter('price','underfive', this.checked)">
<span class="checkmark"></span>
</label>
<label class="container"> $5.00 - $27.00
<input type="checkbox" id="fiveto27" onclick="changefilter('price','fiveToTwentySeven', this.checked)">
<span class="checkmark"></span>
</label>
<label class="container"> Over $27.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<h1>Portion Size</h1>
<label class="container"> Under $5.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<label class="container"> $5.00 - $27.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<label class="container"> Over $27.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<h1>Rating</h1>
<label class="container"> Under $5.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<label class="container"> $5.00 - $27.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<label class="container"> Over $27.00
<input type="checkbox">
<span class="checkmark"></span>
</label>
<button id="filterBtn" class="confirm-btn-large">Show all 35 stores</button>
</div>
<div id="burgers"></div>
推荐阅读
- javascript - 使用源映射 Unuglify js 文件
- c# - 如何在 C# 中进行参数化 SELECT 查询?
- javascript - Javascript - 仅在检测到景观时运行我的脚本
- mongodb - 多个 $lookup 聚合,有些是 1 比 1,有些是 1 比多
- c# - c# razor - 如果基于请求数据的 sql 条件
- javascript - 如何通过单个反应选择正确使用 Yup 模式?
- python - 如何修复 'TypeError: unhashable type: 'list' 错误?
- java - 如何在 Java 中使用 POST/GET http 方法发送/获取数据 - REST API
- angular - 使用响应式表单和 ChangeDetectionStrategy.OnPush 显示验证消息
- firebase - 如何在 Web CMS 中隐藏文档字段,但在 android 和 iOS 中不隐藏