从JSON API检索特定键名时遇到问题

时间:2018-12-27 17:17:23

标签: javascript json key

我有一个具有以下JSON签名的API:

[{
   "id": 3,
   "impact": 7,
   "probability": 0.7,
   "title": "Risk 3"
}]

现在我可以说这种格式的3个相似的对象,它们实际上演示了公司的不同风险名称或编号。现在,我需要找出影响或可能性最高的风险数字。以及哪些风险具有最高的RPZ,

 RPZ = impact * probability 

我设法找到json中任何属性的最高值。但是我尝试了很多方法来找出与之相关的标题或风险名称。这是我无法实现的目标。例如,我的目标是获取最高的价值,可以说上面示例的影响为7,并在此处打印出其风险名称(即标题)。我能够获得最高值,但无法打印出其相应的风险名称或标题。

一个小片段。...

var con = JSON.parse(body);

var highImpact = Math.max.apply(Math, con.map(i => i.impact));

现在从上述highImpact为7,现在我需要提取对应的风险名称,即……风险3。这就是我在努力的地方。

我已经检查了该社区中其他开发人员提出的许多类似问题,还检查了Internet上的一些网页和博客。但是直到现在,我什么也没有找到解决方案。

如果你们中的某人能帮助我,将不胜感激

v

ar Request = require('request');


Request.get("https://webdevbootcamp-jay-jayantamgr.c9users.io/api/risks", (error, response, body) => {
    if(error)
    {
        return console.dir(error);
    }
    var con = JSON.parse(body);

    var highImpact = Math.max.apply(Math, con.map(i => i.impact));


    var highProb = Math.max.apply(Math, con.map(p => p.propability));



    let dictRPZ = [];
    function addRPZ(RiskName, RPZ){
        dictRPZ.push({RiskName, RPZ});
    }

    con.forEach(function(item){
        var RPZ = item.impact * item.propability;
        addRPZ(item.title, RPZ);
    });

});

预期结果是制作一个仪表板,并显示影响力最大,最高RPZ的风险,实时风险表和移动平均线图

3 个答案:

答案 0 :(得分:2)

您可以这样进行,以降序排序并选择已排序数组的第一个元素。

let arr = [
  { "id": 3, "impact": 7, "probability": 0.7, "title": "Risk 3" },
  { "id": 4, "impact": 8, "probability": 0.8, "title": "Risk 4" }
]

let highestImpact = arr.sort((a,b)=>b.impact-a.impact)[0].title;

console.log(highestImpact)

对于最高的RPZ,您可以这样做

let arr = [
      { "id": 3, "impact": 7, "probability": 0.7, "title": "Risk 3" },
      { "id": 4, "impact": 8, "probability": 0.8, "title": "Risk 4" },
      { "id": 5, "impact": 10, "probability": 0.8, "title": "Risk 5" }
]

let highestRpz = arr.map(e=> {
 e.rpz= e.impact * e.probability
 return e;
 }).sort((a,b)=>b.rpz-a.rpz)[0].title

    console.log(highestRpz)

答案 1 :(得分:0)

您可以通过在reduce()循环中应用公式始终返回最大值(根据您想要的任何条件)来找到最大值。这比对整个数组进行排序更有效,因为您只需要单次通过就可以创建一个新数组,而不必丢弃它。它会从满足您设置条件的数组中返回对象:

let arr = [
    { "id": 3, "impact": 7, "probability": 0.7, "title": "Risk 3" },
    { "id": 4, "impact": 4, "probability": 0.72, "title": "Risk 4" },
    { "id": 5, "impact": 1, "probability": 0.6, "title": "Risk 5" },    
    { "id": 6, "impact": 8, "probability": 0.91, "title": "Risk 6" }
]

// max impact * probability
let max = arr.reduce((max, current) => 
    current.impact * current.probability > max.impact * max.probability
    ? current
    : max
)
console.log(max)

对于单个值,它是相同的想法,但是更简单:

let arr = [
    { "id": 3, "impact": 7, "probability": 0.7, "title": "Risk 3" },
    { "id": 4, "impact": 4, "probability": 0.72, "title": "Risk 4" },
    { "id": 5, "impact": 9, "probability": 0.1, "title": "Risk 5" },    
    { "id": 6, "impact": 8, "probability": 0.91, "title": "Risk 6" }
]

// max impact
let max = arr.reduce((max, current) => 
    current.impact > max.impact 
    ? current
    : max
)
console.log(max)

答案 2 :(得分:0)

另一个例子:

  function findHighest(arr){
    var highest = arr[0];

    for(let i = 0; i < arr.length; i++) {
        let current = arr[i]
        let rpz = current.impact * current.probability;
        if(rpz > (highest.impact * highest.probability)) {
            highest = current
        }
    }
    return highest.title
}