You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:31:04