【问题标题】:How to Filter on multiple strings in JS? [duplicate]如何在 JS 中过滤多个字符串? [复制]
【发布时间】:2019-03-25 08:32:00
【问题描述】:

我希望能够过滤数组中的多个字符串(类型)。例如,我想过滤类型 meat 并在下面的数据结构中键入 fruit。 我想要实现的是过滤后的数据对象。

const data = [{type: "meat", food: "hamburger"}, {type:"fruit", food:"banana"}, {type:"fish", food: "red snapper"}, {type:"vegetables", food:"fungi"}]

let filter1 = 'meat'
let filter2 = 'fruit'

const filteredData = data.filter( post => post.type.includes(filter1, filter2) ? post:'');

// My expected result after filtering: [{type: "meat", food: "hamburger"}, {type:"fruit", food:"banana"}]

不幸的是,它返回 4 个结果,而不是上面预期的 2 个。

我知道如何在 _underscore.js 之类的库中处理这个问题,但我想在现代 EcmaScript 中实现它。

【问题讨论】:

    标签: javascript filter ecmascript-6 include filtering


    【解决方案1】:

    首先创建一个您想要包含的types 数组,然后然后您可以对该数组使用.includes 测试。 (目前,您的post.type.includes(filter1, filter2) 不起作用,因为includes 只接受一个参数)

    const data = [{type: "meat", food: "hamburger"}, {type:"fruit", food:"banana"}, {type:"fish", food: "red snapper"}, {type:"vegetables", food:"fungi"}]
    
    let filter1 = 'meat'
    let filter2 = 'fruit'
    
    const filters = [filter1, filter2];
    
    const filteredData = data.filter(({ type }) => filters.includes(type));
    console.log(filteredData);

    您也可以使用Set 来降低运行时复杂度

    const data = [{type: "meat", food: "hamburger"}, {type:"fruit", food:"banana"}, {type:"fish", food: "red snapper"}, {type:"vegetables", food:"fungi"}]
    
    let filter1 = 'meat'
    let filter2 = 'fruit'
    
    const filters = new Set([filter1, filter2]);
    
    const filteredData = data.filter(({ type }) => filters.has(type));
    console.log(filteredData);

    【讨论】:

    • 感谢您提供这些清晰的示例。帮助我更好地理解这个概念。我还有一个问题;如果要过滤每种类型是否由两个实例组成,例如 type: {type: ["meat", "american"], food: hamburger} ,如何实现这种方法?
    • 这会有点复杂,遍历过滤器对象的entries 并检查值是否匹配(如果是数组),或者普通值是否匹配(如果字符串)
    • @CertainPerformance 如果 'filters' 中的字符串是大写字母,我们想在匹配 filter 中的 'type' 之前先将它们更改为 lowerCase() 怎么办?
    • @bubble-cord 将 new Set([filter1, filter2]); 更改为 new Set([filter1, filter2].map(str => str.toLowerCase()));
    • @CertainPerformance 如何更改/检查循环内部的 lowerCase() const filtersData = data.filter(({ type }) => filters.includes(type)); console.log(filteredData); ?
    猜你喜欢
    • 2013-09-08
    • 1970-01-01
    • 2023-03-06
    • 2021-12-09
    • 1970-01-01
    • 2018-01-31
    • 2022-07-04
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多