我正在编写一个简单的应用程序,它考虑了发生风险的可能性及其后果的严重性,并将其转换为基于风险矩阵对风险的严重程度的评级。
我当前的解决方案是将可能性和结果转换为1-5,将它们相乘,然后在一堆if / else语句中使用结果来获得风险等级。我的问题是范围重叠,因此我不得不单独处理这些情况,我觉得这有点不合时宜。
var likelihoods = {
"Rare" : 1,
"Unlikely" : 2,
"Possible" : 3,
"Likely" : 4,
"Almost Certain" : 5,
};
var consequences = {
"Minor" : 1,
"Moderate" : 2,
"Major" : 3,
"Severe" : 4,
"Extreme" : 5,
};
var likelihood = likelihoods[item.likelihood];
var consequence = consequences[item.consequence];
var riskVal= likelihood * consequence;
if (likelihood == 2 && consequence == 2) { riskRating = 1 }
else if (likelihood == 1 && consequence == 5) { riskRating = 3 }
else if (likelihood == 2 && consequence == 5) { riskRating = 4 }
else if (riskVal <= 3) { riskRating = 1 } //Low risk
else if (riskVal <= 6) { riskRating = 2 } //Medium risk
else if (riskVal <= 12) { riskRating = 3 } //High risk
else { riskRating = 4 } //Critical risk
有什么更干净的方法可以做到这一点?
最佳答案
我认为最好使它尽可能自我记录。因此,实际上将表包括在源代码中对我来说非常有用。为此,我将编写一个(希望是通用的)函数,该函数解析这样的表并返回一个接受行和列并返回匹配值的函数。也许是这样的:
const lookup = (tbl) => {
const allRows = tbl.split('\n')
.filter(row => row.length && !row.startsWith('|---'))
const colNames = allRows[0].split(/\|/).map(s => s.trim())
.filter(s => s.length > 0)
const rows = allRows.slice(1).map(r => r.split(/\|/)
.map(s => s.trim()).filter(s => s.length > 1))
const table = rows.reduce((table, row) => {
table[row[0]] = row.slice(1).reduce((r, col, idx) => {
r[colNames[idx]] = col;
return r
}, {})
return table
}, {});
return (row, col) => (table[row] || {})[col]
}
var riskVal = lookup(`
| Minor | Moderate | Major | Severe | Extreme |
|----------------|--------|----------|----------|----------|----------|
| Rare | Low | Low | Low | Medium | High |
| Unlikely | Low | Low | Medium | High | High |
| Possible | Low | Medium | High | High | Critical |
| Likely | Medium | High | High | Critical | Critical |
| Almost Certain | Medium | High | Critical | Critical | Critical |
`)
console.log(riskVal('Possible', 'Severe')) //=> 'High'
console.log(riskVal('Almost Certain', 'Major')) //=> 'Critical
console.log(riskVal('Unlikely', 'Extreme')) //=> 'High
console.log(riskVal('Rare', 'Minor')) //=> 'Low'
console.log(riskVal('Possible', 'Moderate')) //=> 'Medium'
显然,如果您想要输入或输出数字值,则可以只切换表,尽管您可能需要在运行时将某些字符串解析为数字(或对某些数字进行字符串化处理)。
请注意,
lookup
是通用的。如果您按如下所示构造表,则行标题或列标题中的内容无关紧要,返回的函数应产生适当的单元格值。当然,不能有重复的行标题或列标题,但这似乎是一个合理的限制。另请注意,我将您的代码快速转换回了表中。那里可能有一个或两个错误。不要指望这个特定的表是准确的。