JavaScript的.filter方法如何通过数组批量排除指定分类和商品
JS filter多排除项优化实现
逐行写不等值判断的方式在排除项增多时维护性极差,通过数组内置方法可以把排除规则抽离为独立配置数组,无需重复编写判断逻辑。
可用代码
先把需要排除的分类、商品单独维护为数组,后续增减排除规则只需要修改这两个数组,不需要调整过滤逻辑:
var excludedcats = [3, 5, 8, 11] var excludedproducts = [191, 139, "string instead of int"] var myfilter = myjson.filter(function(c) { return !excludedcats.includes(c.category) && !excludedproducts.includes(c.product) });
逻辑说明
数组.includes(目标值)是JS数组的内置方法,会遍历检查目标值是否存在于数组中,存在返回true,不存在返回false- 方法前加
!为结果取反:!excludedcats.includes(c.category)等价于之前逐行编写的所有分类不等判断,含义为「当前分类不在排除列表中」 - 两个判断条件用
&&连接,只有同时满足分类、商品都不在排除列表时,数据才会被保留,和原有代码的执行效果完全一致
老旧环境兼容写法
如果需要兼容IE11等不支持includes方法的运行环境,可以替换为indexOf实现,逻辑完全相同:
var myfilter = myjson.filter(function(c) { // indexOf未匹配到目标值时固定返回-1,判断等于-1即代表值不在排除数组内 return excludedcats.indexOf(c.category) === -1 && excludedproducts.indexOf(c.product) === -1 });
你之前直接写
c.category != excludedcats不生效的原因是:excludedcats是数组类型,直接和数字、字符串类型的字段值做比较,永远会判定为不相等,无法实现逐个匹配排除项的效果。
内容的提问来源于stack exchange,提问作者cryptonewbie
相关产品推荐
相关产品推荐

