如何按自定义状态优先级从对象数组中获取最小状态?
问题描述
状态优先级定义:Not Started(最低)< Submitted < Complete(最高)。需求是从对象数组中筛选出优先级最低的状态;若数组仅含一项,则直接返回该状态。现有用Math.min实现的getMin函数无法正确运行,求正确实现思路。
当前代码(无法正常运行)
getMin(id:number , key:string) { let data = [ { "id": 14, "status": "Submitted", }, { "id": 15, "status": "Not Started", } ] let min = Math.min(...data.map(item => item.status)); console.log('result' , min) }
状态优先级对应关系
statuses: any[] = [ { viewValue: 'Not Started', value: 1 }, { viewValue: 'Submitted', value: 2 }, { viewValue: 'Complete', value: 3 }, ]
示例与预期结果
- 示例1:
data = [ { "id": 14, "status": "Submitted", }, { "id": 15, "status": "Not Started", } ]
预期结果:Not Started
- 示例2:
data = [ { "id": 14, "status": "Submitted", }, { "id": 17, "status": "Complete", } ]
预期结果:Submitted
- 示例3:
data = [ { "id": 17, "status": "Complete", } ]
预期结果:Complete
解决方案
问题根源
Math.min仅支持数值类型的比较,直接传入字符串会被转换为NaN,导致无法得到正确结果。我们需要先将状态文本映射为对应的优先级数值,再基于数值比较找出最小优先级的状态。
实现思路
- 构建状态-优先级映射:把状态文本和对应的优先级数值做成键值对,方便快速查找每个状态的优先级。
- 遍历数组筛选最小状态:
- 若数组长度为1,直接返回该元素的状态。
- 否则,遍历数组,比较每个元素状态的优先级数值,保留数值最小的状态。用数组的
reduce方法可以高效完成这个比较过程。
完整代码实现
getMin(id: number, key: string) { const data = [ { "id": 14, "status": "Submitted" }, { "id": 15, "status": "Not Started" } ]; // 构建状态到优先级的映射,比原数组更便于查找 const statusPriority: Record<string, number> = { 'Not Started': 1, 'Submitted': 2, 'Complete': 3 }; // 处理数组为空的边界情况(可选,根据需求补充) if (data.length === 0) { return null; // 或者返回你需要的默认值 } // 数组仅一项时直接返回状态 if (data.length === 1) { return data[0].status; } // 用reduce遍历数组,找出优先级最小的状态 const minStatus = data.reduce((prev, current) => { return statusPriority[prev.status] < statusPriority[current.status] ? prev : current; }).status; console.log('result', minStatus); return minStatus; }
验证示例
- 示例1中,
reduce比较Submitted(优先级2)和Not Started(优先级1),最终返回Not Started。 - 示例2中,比较
Submitted(2)和Complete(3),返回Submitted。 - 示例3中,数组长度为1,直接返回
Complete。
内容的提问来源于stack exchange,提问作者Tim Launders
相关产品推荐
相关产品推荐

