如何用指定数组过滤含分类数组的JavaScript对象数组
正确过滤分类数组的方法
你的核心问题是错误地将数组与字符串直接做相等比较,导致所有判断逻辑失效。以下是正确的实现和问题分析:
基础实现
const criteria = ["business", "travel"]; const filtered = data.filter(item => // 检查当前条目的category数组中,是否存在至少一个属于criteria的分类 item.category.some(category => criteria.includes(category)) );
执行后filtered会保留第1、2、4条数据(仅排除完全不含business/travel的第3条),符合你的需求。
之前方法的问题分析
第一种方法:
criteria.find(element => item.category == element)item.category是数组类型,element是字符串类型,两者类型不匹配,==永远返回false,find会返回undefined,而filter会把undefined视为false,所以实际不会保留任何条目(你描述的仅返回第一条可能是测试数据有误)。第二种方法:
criteria.filter(element => item.category == element)filter方法返回的是数组,无论数组是否为空,在filter回调中都会被视为真值(true),因此所有数据都会被保留。第三种方法:
criteria.indexOf(item.category) === -1item.category是数组,criteria中全是字符串,indexOf永远找不到匹配项返回-1,return -1 === -1等价于返回true,所有数据都会被保留,同时逻辑完全搞反——你需要保留存在匹配的条目,而非不存在的。
性能优化(可选)
如果criteria数组元素较多,用Set来做查找可以提升性能(Set.has()的时间复杂度为O(1),数组includes()为O(n)):
const criteriaSet = new Set(criteria); const filtered = data.filter(item => item.category.some(category => criteriaSet.has(category)) );
内容的提问来源于stack exchange,提问作者Alright
相关产品推荐
相关产品推荐

