gpt4 book ai didi

javascript - React 中的多个过滤器

转载 作者:行者123 更新时间:2023-11-28 17:01:23 24 4
gpt4 key购买 nike

我正在构建一个项目,显示来自 api 的一些数据,现在我需要过滤它。

我已经完成了类别过滤器,现在我必须做一个价格范围过滤器,以便这两个过滤器可以一起工作,但我正在努力如何正确地做到这一点。对于价格范围过滤器,我使用 2 个输入和一个提交按钮。

我有一个对象数组,看起来像这样;

filterData = [
{ name: 'Aang', bender: 'yes', nation: 'Air', person: 'yes', show: 'ATLA', price: 132342 },
{ name: 'Appa', bender: 'yes', nation: 'Air', person: 'no', show: 'ATLA', price: 1322 },
{ name: 'Asami', bender: 'no', nation: 'Republic City', person: 'yes', show: 'LOK', price: 132342 },
{ name: 'Azula', bender: 'yes', nation: 'Fire', person: 'yes', show: 'ATLA', price: 12342 }, etc]

我有状态:

state = {
data: [],
nation: '',
priceStart: '',
priceEnd: ''
}

如果我的折弯机状态发生变化,则设置状态的函数对于开始和结束状态也有类似的函数当我设置价格状态时,我解析它,所以我的状态中有一个数字,顺便说一句,每次我输入一些数字然后删除它时,我都会收到一条警告,它说“收到了“值”属性的 NaN

 chFilter = (type, val) => {
switch(type) {
case 'nation':
this.setState({ nation: val });
break;
case 'priceStart':
this.setState({ priceStart: val });
break;
case 'priceEnd':
this.setState({ priceEnd: val });
break;
default:
break;
}
}
getBenders = () => {
const { data, category, priceStart, priceEnd } = this.state;
if( nation || priceStart || priceEnd ){
return data.filter(this.filterBender);
} else {
return data;
}
}

filterBender = data => {
let { nation, priceStart, priceEnd } = this.state;

if(data.nation !== nation) return false;
if(data.price < priceStart) return false;
return true;
}

我认为我需要为所有状态执行一个通用函数,以便它可以观察状态的变化并返回过滤后的数据。帮助如何正确执行此操作

最佳答案

您应该编写一个新的过滤器函数,将这些过滤器合并在一起。并像这样使用它:

filterBender = data => {
const {bender, person, nation} = this.state;
if(bender && data.bender !== bender) return false;
if(person && data.person !== person) return false;
if(nation && data.nation !== nation) return false;
...
return true;
}

const visibelBenders = filterData.filter(filterBender);

这样,您只需过滤一次数据,并且每个弯曲器都会针对每个约束进行一次评估。最后,只有对所有不同的 if 返回 true 的bender 才会被插入到 visibelBenders 数组中,您可以渲染该数组。此外,您可以将其包装到 memorization 中。函数仅在其中一个过滤器发生更改时才执行它。

要显示所有弯曲器,如果未设置过滤器,您可以将过滤器包装到新函数中以检查是否启用过滤。

const getBenders = () => {
const { bender, person, nation} = this.state;
if( person || bender || nation ){
return this.filterData.filter(filterBender);
} else {
return this.filterData;
}
}
const benders = getBenders();

关于javascript - React 中的多个过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57358605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com