I have two selections that are supposed to filter data, they work but separately, how do I make them filter data together?
When I click on the second select, it resets the data from the first one. They filter the same data array, so the result is new all the time, I don't understand how to filter an already filtered array
How do I make a joint filter?
//filter data
const [allData, setAllData] = useState<ICompanie[]>(companiesData);
// status filter
const handleStatusFilter = (status: string): void => {
const filterData = companiesData.filter((item) => {
if (item.status === status) {
return item;
}
});
setAllData(filterData);
};
// category filter
const handleCategoriesFilter = (category: string): void => {
const filterData = companiesData.filter((item) => {
if (item.category === category) {
return item;
}
});
setAllData(filterData);
};
CodePudding user response:
I believe You need to maintain the already selected filter value in the state variable. Please prefer the below code:
const [allData, setAllData] = useState<ICompanie[]>(companiesData);
const [filters, setFilters] = useState({});
//name = status/category
//value = actual value of filter
const handleFilter = (name:string, value:string) => {
const filtersCopy = {...filters};
filtersCopy[name] = value;
const filtersKey = Object.keys(filtersCopy).filter((value)=>!!filtersCopy[value]);
const filterData = companiesData.filter((item) => {
const filterCheck = []
filtersKey.forEach((value) => {
if(item[value] === filtersCopy[value]) {
filtercheck.push(value);
}
})
return filterCheck.length === filtersKey.length
});
setFilters(filtersCopy)
setAllData(filterData);
}
CodePudding user response:
That happens because allData
is const and when you invoke setAllData
you always apply the filter from the immutable allData
, and lose update.
See if you want to expose filterData
instead (e.g. turn allData
to non const and assign filterData
to it when you filter, maybe have a mechanism to restore the unfiltered original allData
).