如何在JS中对多个字符串进行过滤?

6

我希望能够在数组中筛选多个字符串(类型)。例如,我想在下面的数据结构中筛选类型为meatfruit的数据。 我的目标是得到一个已筛选的数据对象。

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中实现它。

1个回答

11

首先创建一个包含所需类型的数组,然后可以在该数组上使用.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);


@CertainPerformance 如果 'filters' 中的字符串是大写字母,我们想在与过滤器中的 'type' 匹配之前先将它们转换为小写字母,该怎么办? - program_bumble_bee
@bubble-cord 将 new Set([filter1, filter2]); 更改为 new Set([filter1, filter2].map(str => str.toLowerCase())); - CertainPerformance
@bubble-cord 你需要将两个集合都转换为小写。使用Set方法 - 像上面的评论一样映射到小写,然后在过滤时调用 toLowerCase.filter(({ type }) => filters.has(type.toLowerCase())); - CertainPerformance
@CertainPerformance 好的,这个方法可行,但是它似乎没有正确处理带有空格的单词。例如,我的字符串数组看起来像这样[' Sun Flower', 'Water Melon']。它只返回正确的结果,如果我输入完整的确切字符串,如'Water Melon',而不是如果我搜索'melon'或'water'或只是'Water'。你能帮助解释原因并提供解决方案吗? - program_bumble_bee
@bubble-cord Set#hasArray#includes 只能找到完全匹配的内容,无法搜索子字符串。如果你想要查找子字符串,你需要再加一个内部循环,类似于 str => filers.some(filter => filter.includes(str.toLowerCase())) - CertainPerformance
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接