JavaScript如何根据指定状态数组过滤对象数组
问题根源
你的代码无法得到正确结果,存在两个核心错误:
forEach方法本身没有返回值,无论回调内返回什么内容,forEach执行后始终返回undefined。而filter方法需要回调返回布尔值判定元素是否保留,undefined会被判定为假值,最终会返回空数组。- 现有判断逻辑只做了单状态满足就返回的判断,不符合「所有指定状态值均大于0才保留元素」的需求。
修复方案
判断数组内所有元素是否都满足指定条件,应该使用Array.every()方法:该方法会遍历数组,仅当所有元素都满足回调的判断规则时返回true,只要有一个元素不满足就直接返回false,完全匹配你的筛选需求。
实现代码如下:
const result = data.filter(item => { return statuses.every(statusKey => item.status[statusKey] > 0) })
执行后得到的结果和预期完全一致:
[ { id: 1, name: "data1", status: { open: 1, closed: 1, hold: 0, block: 1 } } ]
执行逻辑
- 遍历原始
data数组的每一个元素 - 对当前元素,逐一校验
statuses中列出的状态键,检查对应item.status下的数值是否大于0 - 所有指定状态值都大于0时,
every返回true,当前元素被保留到结果数组 - 任意一个指定状态值小于等于0时,
every返回false,当前元素被过滤
内容的提问来源于stack exchange,提问作者HardRock
相关产品推荐
相关产品推荐

