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

如何高效实现JavaScript数组状态计数判断并返回布尔值?

高效判断对象数组状态的单函数实现方案

需求说明

当数组满足以下任一条件时,需返回false:

  • 数组中没有return状态的元素
  • 数组中没有ordered状态的元素
  • 数组中存在恰好1个verification状态的元素
  • 数组中存在恰好1个active状态的元素

示例数组

const slots = [
  {
    status: 'void'
  },
  {
    status: 'closed'
  },
  {
    status: 'ordered'
  },
  {
    status: 'verification'
  },
  {
    status: 'active'
  }
]

低效写法(需避免)

你提到的多次filter写法会重复遍历数组,效率较低:

// 示例低效代码
x = slots.filter((val) => val.status === 'verification' || val.status === 'active')
if (x.length > 1) return false

y = slots.filter((val) => val.status === 'return' && val.status === 'ordered')
if (y.length > 0) return false

高效单遍历实现方案

我们可以通过单次遍历数组,同步统计关键状态的数量,最后统一判断条件,这样只需要遍历数组一次,性能更优:

function checkSlotsStatus(slots) {
  let hasReturn = false;
  let hasOrdered = false;
  let verificationCount = 0;
  let activeCount = 0;

  for (const slot of slots) {
    const status = slot.status;
    switch (status) {
      case 'return':
        hasReturn = true;
        break;
      case 'ordered':
        hasOrdered = true;
        break;
      case 'verification':
        verificationCount++;
        // 提前终止:数量超过1后,后续遍历不影响结果,可直接跳出
        if (verificationCount > 1) break;
        break;
      case 'active':
        activeCount++;
        if (activeCount > 1) break;
        break;
      // 其他状态无需处理
      default:
        break;
    }
  }

  // 触发返回false的条件判断
  if (!hasReturn || !hasOrdered || verificationCount === 1 || activeCount === 1) {
    return false;
  }

  // 所有条件都不满足时返回true
  return true;
}

代码说明

  1. 单次遍历:仅循环数组一次,在遍历过程中完成所有关键状态的统计,避免多次遍历带来的性能损耗
  2. 提前终止:当verification或active的数量超过1时,后续遍历不会改变最终判断结果,可以提前跳出循环,进一步优化性能
  3. 逻辑清晰:遍历结束后集中判断所有触发false的条件,代码可读性更强

内容的提问来源于stack exchange,提问作者Rafael Polonio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:10:36