简体   繁体   English

过滤具有多个项目的平面列表

[英]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如datenumber of passengerscost ,等等......而filteredDatefilteredPassangersfilteredCost是状态变量允许用户选择他希望如何过滤。

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.例如,如果我过滤datecost项目,我希望 Ride 组件仅返回datacost为真的骑行。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM