JavaScript数组过滤问题:过滤关闭位置后结果数量不符
问题分析与解决方案
嘿,我一眼就看到你过滤逻辑里的核心问题啦!你的条件判断用了||(逻辑或),这导致无论category是什么值,这个条件都会返回true,所以根本过滤不掉那些你想排除的“关闭”状态项。
为什么原逻辑无效?
咱们拆解一下原判断条件:
if (val.category != CClosed || val.category != Cclosed || val.category != CClose)
举个具体例子:
- 如果某个项的
category是"C Closed",那么val.category != Cclosed和val.category != CClose都是true,整个||表达式结果为true,这个项会被保留; - 如果
category是"closed",那另外两个不等于的条件也会成立,同样会被保留; - 哪怕
category是null,三个不等于的条件全为true,当然也会被保留。
这就导致所有项都被留了下来,完全达不到过滤的目的。
修正后的代码方案
你需要用&&(逻辑与)来判断,也就是只有当category同时不匹配这三个关闭状态时,才保留该项。这样就能精准过滤掉目标项,同时自动保留category为null的项(因为null不等于任何这三个字符串)。
方案一:直接修正逻辑运算符
var CClose = "C Closed"; var Cclosed = "closed"; var CClosed = "C closed"; standardAZList = $.map(nameArray, function (val, key) { // 用&&替代||,确保同时不匹配三个关闭状态才保留 if (val.category != CClosed && val.category != Cclosed && val.category != CClose) { return val; } });
方案二:更优雅的数组包含判断(推荐)
把所有要排除的状态放进一个数组,用includes方法判断,代码更简洁,扩展性更强:
// 把所有需要排除的关闭状态统一放进数组 const excludedCategories = ["C Closed", "closed", "C closed"]; standardAZList = $.map(nameArray, function (val, key) { // 只要category不在排除数组中,就保留(包括null的情况) if (!excludedCategories.includes(val.category)) { return val; } });
验证效果
这样修改后,就能过滤掉所有category为"C Closed"、"closed"、"C closed"的项,同时保留category为null的项,最终得到你预期的110项结果。
内容的提问来源于stack exchange,提问作者KidKode
相关产品推荐
相关产品推荐

