如何在TypeScript中根据statusC推导statusP?求补全判断条件
解决方案
首先要明确:单纯用map遍历无法直接完成状态统计(map的作用是转换元素,而非汇总状态),正确思路是先统计detail中statusC的状态分布,再按规则设置statusP。
假设你的基础代码结构如下(基于问题描述的枚举与数组定义):
enum Status { ACCEPTED, REJECTED, COMPLETED } // 数组a的元素结构 class Item { List<Detail> detail; Status statusP; } class Detail { Status statusC; }
高效实现逻辑
for (Item item : a) { boolean hasAccepted = false; boolean hasRejected = false; // 遍历detail,标记是否存在两种状态 for (Detail d : item.detail) { if (d.statusC == Status.ACCEPTED) { hasAccepted = true; } else if (d.statusC == Status.REJECTED) { hasRejected = true; } // 提前终止循环:已找到两种状态,无需继续遍历 if (hasAccepted && hasRejected) { break; } } // 补全{?}处的判断逻辑 if (hasAccepted && !hasRejected) { item.statusP = Status.ACCEPTED; } else if (!hasAccepted && hasRejected) { item.statusP = Status.REJECTED; } else { item.statusP = Status.COMPLETED; } }
逻辑说明
- 先遍历
detail列表,标记是否存在ACCEPTED和REJECTED状态 - 遍历过程中若已同时找到两种状态,直接终止循环提升效率
- 最后根据标记组合结果设置
statusP:- 仅存在
ACCEPTED→ 设为ACCEPTED - 仅存在
REJECTED→ 设为REJECTED - 两种状态都存在(或
detail为空)→ 设为COMPLETED
- 仅存在
基于Stream的实现(若坚持用map相关操作)
如果一定要用Stream的map来处理,可以先收集所有statusC到集合中再判断:
for (Item item : a) { Set<Status> statusSet = item.detail.stream() .map(Detail::getStatusC) .collect(Collectors.toSet()); if (statusSet.equals(Collections.singleton(Status.ACCEPTED))) { item.statusP = Status.ACCEPTED; } else if (statusSet.equals(Collections.singleton(Status.REJECTED))) { item.statusP = Status.REJECTED; } else { item.statusP = Status.COMPLETED; } }
原map遍历逻辑错误的原因
map仅负责将每个Detail转换为对应的statusC,无法直接汇总所有状态的整体分布,必须先收集状态信息后再做判断,否则无法覆盖“同时存在两种状态”的场景。
内容的提问来源于stack exchange,提问作者Cường Trần
相关产品推荐
相关产品推荐

