使用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;
问题分析
原代码存在两处核心错误:
arrobj是数组,不能直接访问arrobj.details,需遍历数组内的每个对象;- 统计逻辑不符合规则:
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
相关产品推荐
相关产品推荐

