JavaScript多条件filter不生效:过滤含指定分类的数组失败
解决数组过滤分类结果为空的问题
嘿,我懂你的困扰啦!你现在遇到的问题是用forEach判断分类是否存在导致过滤结果为空,这是因为forEach本身不会返回任何值(默认返回undefined),所以你的过滤条件永远等价于false,自然filteredArray就空了。
正确解法:用Array.some()判断分类存在性
我们可以用some()方法来检查当前文章的分类数组里是否包含目标slug,some()会遍历数组,只要有一个元素满足条件就返回true,正好适配filter()需要的布尔判断条件。
首先先修正你原数组的语法错误(补全缺失的括号):
const array = [ { name: 'my post', categories: [{ slug: 'a-cat', name: 'A Category' }] }, { name: 'my other post', categories: [ { slug: 'another-category', name: 'Another Category' }, { slug: 'a-cat', name: 'A Category' } ] } ];
然后是正确的过滤代码:
const filteredArray = array.filter(item => { // 检查当前item的categories中是否有slug为"another-category"的分类 return item.categories.some(category => category.slug === 'another-category'); }); console.log(filteredArray); // 输出结果:[{ name: 'my other post', categories: [...] }]
为什么原来的forEach不行?
当你在filter的回调里写item.categories.forEach(...)时,不管你在forEach的回调里写多少次return,forEach本身都只会返回undefined。而filter会把undefined当成false处理,所以所有元素都被过滤掉了,最终得到空数组。
替代方案:用Array.find()
如果你习惯用find,也可以通过判断find是否返回有效元素来实现,不过some的语义更清晰(明确表示“是否存在满足条件的元素”):
const filteredArray = array.filter(item => { return item.categories.find(category => category.slug === 'another-category') !== undefined; });
内容的提问来源于stack exchange,提问作者Marine Le Borgne
相关产品推荐
相关产品推荐

