【问题标题】:How to translate a risk matrix into a data structure?如何将风险矩阵转换为数据结构?
【发布时间】:2018-02-22 03:49:01
【问题描述】:

我正在编写一个简单的应用程序,它会考虑风险发生的可能性及其结果的严重性,并将其转化为基于风险矩阵的风险严重程度评级。

我目前的解决方案是将可能性和后果转换为 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

有什么更清洁的方法来做到这一点?

【问题讨论】:

  • 我将使用硬编码的 5x5 二维数组。但它不能很好地扩展
  • @BryanChen 如果它不能扩展,你仍然可以根据你拥有的任何规则动态创建它,而不是硬编码它

标签: javascript maintainability


【解决方案1】:

我认为最好让它尽可能地自我记录。所以实际上在源代码中包含表格让我觉得非常有帮助。为此,我将编写一个(希望是通用的)函数来解析这样的表并返回一个接受行和列并返回匹配值的函数。也许是这样的:

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 是通用的。如果您按所示构建表格,则行或列标题中的内容无关紧要,返回的函数应该产生适当的单元格值。当然,不能有重复的行或列标题,但这似乎是一个合理的限制。

另请注意,我很快将您的代码翻译回表格。那里可能有一两个错误。不要指望这个特定的表格是准确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2020-09-21
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多