[英]Filtering flatlists with several items
I am learning React Native
by building a RideSharing app.我正在通过构建一个 RideSharing 应用程序来学习
React Native
。 I have a function that allows the user to filter a FlatList
component with several ride and each one of them has different items associated to, sutch as date
, number of passengers
, cost
, etc... And filteredDate
, filteredPassangers
, filteredCost
are state variables that allow the user to choose how he wishes to filter.我有一个功能,允许用户筛选
FlatList
几个骑组件和他们每个人都有关联到不同的项目,sutch如date
, number of passengers
, cost
,等等......而filteredDate
, filteredPassangers
, filteredCost
是状态变量允许用户选择他希望如何过滤。
I wrote the function that filters the data like this:我编写了过滤数据的函数,如下所示:
function filter() {
const newData1 = lists.filter(
item => {
return item.de === filteredFrom
|| item.para === filteredTo
|| item.date === filteredDate
|| item.passangers=== filteredPassangers
|| item.date === filteredDate
|| item.cost3 === filteredCost
})
props.setLists(newData1),
//...
}
When I filter more than 1 item, it returns any Ride component that has at least one of those values as true.当我过滤 1 个以上的项目时,它会返回至少具有这些值之一为真的任何 Ride 组件。 However, I only want it return the Rides on which the values I am filtering are true.
但是,我只希望它返回我过滤的值为 true 的 Rides。
For example, if I filter the date
and cost
items, I want the Ride component to return only the rides on which data
and cost
are true.例如,如果我过滤
date
和cost
项目,我希望 Ride 组件仅返回data
和cost
为真的骑行。
How can I code this in order to filter through the items that are true?我该如何编码以过滤真实的项目?
EDIT编辑
This is the current code:这是当前的代码:
let screen;
if (selectedValue==='de') { () =>
setFlags(flags => [...flags, filteredFrom]);
screen=
//...
} else if (selectedValue==='para') { () =>
setFlags([...flags, filteredTo]);
screen=
//...
} else if (selectedValue==='date') { () =>
setFlags(flags => [...flags, filteredDate]);
screen=
//...
} else if (selectedValue==='passangers') { () =>
setFlags(flags => [...flags, filteredPassangers]);
screen=
//...
} else if (selectedValue==='cost3') { () =>
setFlags(flags => [...flags, filteredCost]);
screen=
//...
}
//Filtering
function filterRides() {
const newData1 = lists.filter(
item => {
return (flags.includes("filteredFrom")? item.de === filteredFrom :true)
&& (flags.includes("filteredTo")? item.para === filteredTo :true)
&& (flags.includes("filteredDate")? item.date === filteredDate :true)
&& (flags.includes("filteredPassangers")? item.passangers === filteredPassangers :true)
&& (flags.includes("filteredCost")? item.cost3 === filteredCost :true)
})
console.log(flags);
props.setLists(newData1);
//...
}
You are using ||
您正在使用
||
instead of the &&
aka or
instead of and
.代替
&&
aka or
代替and
。 try this:尝试这个:
function filter() {
const newData1 = lists.filter(
item => {
return item.de === filteredFrom
&& item.para === filteredTo
&& item.date === filteredDate
&& item.passangers=== filteredPassangers
&& item.date === filteredDate
&& item.cost3 === filteredCost
})
props.setLists(newData1),
//...
}
EDIT:编辑:
If you want to use only some of the filters you can add a list of active flags in a state and then check each item against the state如果您只想使用某些过滤器,您可以在状态中添加活动标志列表,然后根据状态检查每个项目
const [flags, setFlags] = useState([]) //edit2: set this whenever the user selects a filter
function filter() {
const newData1 = lists.filter(
item => {
return (flags.includes("filteredFrom")? item.de === filteredFrom :true)
&& (flags.includes("filteredTo")? item.para === filteredTo :true) ...
})
props.setLists(newData1),
//...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.