【发布时间】:2021-09-23 22:36:08
【问题描述】:
我的网站上有一个待售汽车列表,以及五个过滤器:
- 制作
- 型号
- 年份
- 里程
- 价格
...每个选项都有多个可供用户过滤的选项。
当用户检查过滤器列表中的一个或多个选项时,我需要隐藏与所有选定过滤器不匹配的汽车。
这是其中一辆车的 HTML:
<div class="home-car-div">
<div class="home-car-description-div">
<p class="home-car-info" data-year="2018" data-make="Ford" data-model="Escape" data-mileage="10000" data-price="18900">
2018 Ford Escape
</p>
</div>
</div>
这里是过滤器之一:
<div class="car-filters">
<div class="make-section">
<p class="filter-title">Make</p>
<div id="makeSection" data-group="make">
<label class="filter-input">
<input type="checkbox" name="make" class="make" value=“Ford”>Ford
</label>
<label class="filter-input">
<input type="checkbox" name="make" class="make" value="Subaru"> Subaru
</label>
</div>
</div>
</div>
我已经关注了网站上的其他一些问题,而且我似乎已经完成了大部分工作。每当用户选中其中一个过滤器复选框时,我都会在键/值对数组中获取每个属性的所有值:
var $filterCheckboxes = $( '.filter-input input' );
$filterCheckboxes.on( 'change', function() {
$('.home-car-div').show();
var selectedFilters = {};
$filterCheckboxes.filter( ':checked' ).each( function() {
if ( ! selectedFilters.hasOwnProperty( this.name ) ) {
selectedFilters[ this.name ] = [];
}
selectedFilters[ this.name ].push( this.value );
});
$('.home-car-info').each(function() {
var carMake = $(this).data('make');
var carModel = $(this).data('model');
var carYear = $(this).data('year');
var carPrice = $(this).data('price');
var carMileage = $(this).data('mileage');
var filteredMake = selectedFilters.make;
var filteredModel = selectedFilters.model;
var filteredYear = selectedFilters.year;
var filteredPrice = selectedFilters.price;
var filteredMileage = selectedFilters.mileage;
});
});
所以现在我有每个汽车属性的变量,以及每个过滤选择的变量,但我现在需要比较每一个,并以某种方式隐藏不匹配所有属性的汽车。
如果没有结果,我也想显示一条消息。
我是否在正确的轨道上,我该如何进行过滤?
【问题讨论】:
-
假设
filterCheckboxes拥有<input type="checkbox">的集合,每个value将保持不变。这将导致selectedFilters[x]始终为空或持有单个元素。你可以通过做类似的事情来实现同样的事情:selectedFilters = $('.filter-input input:checked').map( function() { return this.value })。如果每个“过滤器”实际上有多个复选框,这会有所改变。可能有助于分享您的 UI 的那部分。 -
谢谢。每个过滤器都有多个复选框。我在原始帖子中添加了一个过滤器(Make)的示例。
-
如果只有一种类型的过滤器(例如 Make),我可以使用 if 语句进行过滤以检查 if (filteredMake.includes(carMake)),但在尝试检查时我崩溃了每种过滤器类型,并考虑未选中任何选项的情况。
-
是的,你可以这样做:
selectedFilters = $('.filter input:checked').get().reduce( function(a, c) { a[c.name] = (a[c.name] || []); a[c.name].push(c.value); return a } ) -
谢谢。这在脚本中的哪个位置?是否替换 selectedFilters[ this.name ].push( this.value );
标签: javascript jquery arrays filter