简体   繁体   English

如何在javascript中过滤具有多个条件的数组?

[英]How to filter arrays with multiple conditions in javascript?

So my example array as follows,所以我的示例数组如下,

{
    "available": [
        {
            "AC": "false",
            "availableSeats": "18",
            "avlWindowSeats": "10",
            "bookable": "true",
            "nonAC": "true",
            "seater": "false",
            "sleeper": "true",
            "zeroCancellationTime": "0",
            "mTicketEnabled": "true"
        },
        {
            "AC": "false",
            "availableSeats": "18",
            "avlWindowSeats": "10",
            "bookable": "true",
            "nonAC": "true",
            "seater": "true",
            "sleeper": "true",
            "zeroCancellationTime": "0",
            "mTicketEnabled": "true"
        },
        ....
    ]
}

And my filter data as follows,我的过滤数据如下,

var filters = {
            nonAC: [
                "true"
            ],
            seater: [
                "true"
            ],
            sleeper: [
                "true"
            ],
        };

And i have created a query builder which helps to finalize the query !我创建了一个查询构建器,它有助于完成查询!

buildFilter = (filter) => {
        let query = {};
        for (let keys in filter) {
            if ( (filter[keys].constructor === Object) || (filter[keys].constructor === Array && filter[keys].length > 0)) {
                query[keys] = filter[keys];
            }
        }
        return query;
    };

And finally my filter function as follows,最后我的过滤功能如下,

filterData = (data, query) => {
        const filteredData = data.filter( (item) => {
            for (let key in query) {
                if (item[key] === undefined || !query[key].includes(item[key])) {
                    return false;
                }
            }
            return true;
        });
        return filteredData;
    };

If you notice my filter conditions it says如果您注意到我的过滤条件,它会说

seater: [
                "true"
            ],
            sleeper: [
                "true"
            ],

Which obliviously means that if seater and sleeper is true then filter that, but the problem is i need the result as "seater or sleeper" so, if any one is true it should filter that,这显然意味着如果座位和卧铺是真的那么过滤它,但问题是我需要结果为“座位或卧铺”所以,如果任何一个是真的,它应该过滤那个,

So how to change my filter function which accepts as seater or sleeper.那么如何更改我接受作为座椅或卧铺的过滤器功能。

The result should give both the array as result not the second one alone as output !结果应该给两个数组作为结果而不是第二个单独作为输出!

You coiuld get the entries of filters and filter if one of the filter is true .如果filters器之一为true您可以获取filters和过滤器的条目。

 const available = [{ AC: "false", availableSeats: "18", avlWindowSeats: "10", bookable: "true", nonAC: "true", seater: "false", sleeper: "true", zeroCancellationTime: "0", mTicketEnabled: "true" }, { AC: "false", availableSeats: "18", avlWindowSeats: "10", bookable: "true", nonAC: "true", seater: "true", sleeper: "true", zeroCancellationTime: "0", mTicketEnabled: "true" }], filters = { nonAC: ["true"], seater: ["true"], sleeper: ["true"] }, filterEntries = Object.entries(filters), result = available.filter(object => filterEntries.some(([key, values]) => values.includes(object[key])) ); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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