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

使用JavaScript按指定规则统计对象数组中的状态值计数

JavaScript 对象数组状态值统计问题

统计规则

  • 若对象仅含started、仅含progress、同时含started和progress,或同时含started/progress与completed、cancelled,计入started_progress计数;
  • 若对象仅含completed,计入completed计数;
  • 若对象仅含cancelled,计入cancelled计数;
  • 若对象同时含completed和cancelled,计入completed计数。

尝试的错误代码

var arrobj = [{
    id: 22,
    details: [{
        status: "started"
      },
      {
        status: "cancelled"
      }
    ]
  },
  {
    id: 24,
    details: [{
        status: "completed"
      },
      {
        status: "cancelled"
      }
    ]
  },
  {
    id: 44,
    details: [{
      status: "progress"
    }]
  },
  {
    id: 54,
    details: [{
        status: "progress"
      },
      {
        status: "completed"
      }
    ]
  },
  {
    id: 64,
    details: [{
      status: "cancelled"
    }]
  },
  {
    id: 74,
    details: [{
      status: "completed"
    }]
  }
];

var started_progress = arrobj.details.filter(e => ["started", "progress"].includes(e.status)).length;

var completed = arrobj.details.every(i => i.status === "completed").length;

var cancelled = arrobj.details.every(i => i.status === "cancelled").length;

问题分析

原代码存在两处核心错误:

  1. arrobj是数组,不能直接访问arrobj.details,需遍历数组内的每个对象;
  2. 统计逻辑不符合规则:filter仅筛选单个状态元素,every要求所有元素满足条件,无法覆盖多状态组合的判断场景。

正确实现代码

var arrobj = [{
    id: 22,
    details: [{ status: "started" }, { status: "cancelled" }]
  },
  { id: 24, details: [{ status: "completed" }, { status: "cancelled" }] },
  { id: 44, details: [{ status: "progress" }] },
  { id: 54, details: [{ status: "progress" }, { status: "completed" }] },
  { id: 64, details: [{ status: "cancelled" }] },
  { id: 74, details: [{ status: "completed" }] }
];

let started_progress = 0;
let completed = 0;
let cancelled = 0;

arrobj.forEach(obj => {
  // 提取当前对象的所有状态,存入Set去重
  const statusSet = new Set(obj.details.map(item => item.status));
  
  if (statusSet.has('started') || statusSet.has('progress')) {
    started_progress++;
  } else if (statusSet.has('completed')) {
    // 包含completed,无论是否有cancelled都计入completed
    completed++;
  } else if (statusSet.has('cancelled')) {
    cancelled++;
  }
});

console.log(`started_progress = ${started_progress}`);
console.log(`completed = ${completed}`);
console.log(`cancelled = ${cancelled}`);

预期输出

started_progress = 3
completed = 2
cancelled = 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:02:41