您好,我想根据已选中的复选框过滤数据。
我有3个复选框。
<input type="checkbox" name="shoes" value="shoes" class="storesCheckBox" />
<input type="checkbox" name="clothes" value="clothes" class="storesCheckBox" />
<input type="checkbox" name="sports" value="sports" class="storesCheckBox" />
我的商店数据是
// my stores
var stores = [
{
id: 1,
store: 'Store 1',
storeType: "shoes"
},
{
id: 2,
store: 'Store 2',
storeType: "clothes"
},
{
id: 3,
store: 'Store 3',
storeType: "sports"
},
{
id: 4,
store: 'Store 3',
storeSells: "shoes"
}
]
因此,如果我选中shoes
复选框,我想基于storeType shoes
过滤数据。所以我写了
var getStores = stores.filter(function (store) {
return store.storeType === 'shoes';
});
但是现在,如果我选中clothes
并且shoes
已经被选中。我想过滤shoes + clothes
数据。而且,如果我取消选中shoes
,那么我只想过滤衣服数据。根据商店类型,它可以是任意数量的复选框。你能帮我这个忙吗?
答案 0 :(得分:1)
您可以尝试以下方法:
var storeTypesSelected; //array of the types checked
var getStores = stores.filter(function (store) {
return storeTypesSelected.indexOf(store.storeType) > -1;
});
答案 1 :(得分:0)
从选中的复选框中,构造一个选定值的数组(或Set)。然后,在遍历数组时,检查当前storeType
是否包含在集合中:
var stores = [{
id: 1,
store: 'Store 1',
storeType: "shoes"
},
{
id: 2,
store: 'Store 2',
storeType: "clothes"
},
{
id: 3,
store: 'Store 3',
storeType: "sports"
},
{
id: 4,
store: 'Store 3',
storeType: "shoes"
}
];
document.addEventListener('change', () => {
const checkedValues = [...document.querySelectorAll('.storesCheckBox')]
.filter(input => input.checked)
.map(input => input.value);
const filteredStores = stores.filter(({ storeType }) => checkedValues.includes(storeType));
console.log(filteredStores);
});
Shoes: <input type="checkbox" name="shoes" value="shoes" class="storesCheckBox" />
Clothes: <input type="checkbox" name="clothes" value="clothes" class="storesCheckBox" />
Sports: <input type="checkbox" name="sports" value="sports" class="storesCheckBox" />
答案 2 :(得分:0)
所有您需要的是保留复选框值以在数组中进行过滤。
var elems = document.getElementsByClassName("storesCheckBox");
var list = [];
for(var i=0; elems[i]; ++i){
if(elems[i].checked){
list.push(elems[i].value);
}
}
var getStores = stores.filter(function (store) {
return list.indexOf(store.storeType) >= 0;
});
return语句将使用indexOf函数进行过滤。