JS如何筛选数组中最后一个open状态项value符合条件的对象
JS数组筛选:仅判断子数组最后一个匹配状态项的实现
原有代码问题
你之前用Array.find()实现的逻辑存在本质问题:find()会从数组头部开始遍历,返回第一个满足判断条件的元素,所以会匹配到靠前的status: "open"项,无法定位到数组末尾的最后一个open子项,判断结果自然不符合预期。
正确实现思路
对每个外层对象的info数组,优先从后往前遍历,找到的第一个status === "open"的子项,就是整个数组里最后一个open状态的条目,直接判断它的value是否符合筛选条件即可,不需要遍历整个数组,性能最优。
可直接运行的代码
// 示例源数据 const obj = [ { id:1, info : [ {status:"open", value:300}, {status:"closed", value:1}, {status:"open", value:100} ] }, { id:2, info : [ {status:"open", value:40}, {status:"closed", value:1}, {status:"open", value:150}, {status:"open", value:250}, {status:"closed", value:10} ] } ] // 筛选逻辑:value大于200时保留对应外层对象 const filtered = obj.filter(o => { // 从info数组末尾向前遍历 for (let i = o.info.length - 1; i >= 0; i--) { const current = o.info[i]; if (current.status === "open") { // 找到最后一个open项,直接返回判断结果 return current.value > 200; } } // 若info数组无open状态项,直接排除 return false; }) console.log(filtered); // 运行结果仅输出id为2的对象,符合预期
可选的数组方法写法
如果你更习惯用内置数组方法,也可以先过滤出所有open状态的子项,再取最后一个判断,代码可读性更高,只是info数组很长时性能略低于反向遍历:
const filtered = obj.filter(o => { const allOpenItems = o.info.filter(item => item.status === "open"); const lastOpenItem = allOpenItems.at(-1); // 无open项时默认返回false排除 return lastOpenItem ? lastOpenItem.value > 200 : false; })
内容的提问来源于stack exchange,提问作者Taha Yıldırım
相关产品推荐
相关产品推荐

