javascript - 复杂的 JSON obj 和 jQuery 或 Javascript 映射到特定的键、值

标签 javascript jquery json

我正在绞尽脑汁想弄明白这个问题。它不应该这么难。我显然错过了一步。

我正在从 openaq.org 中提取数据

我取回的对象是基于 JSON 对象的。
现在,我正在使用 jQuery 来解析对象,我正在获取包含我想要的特定参数的对象的子部分,但我无法获取特定的键值对。

对象不会一直以相同的顺序返回。所以当我最初尝试建立我的电话时,我做了类似的事情 obj.results.measurements[0]

因为 obj 可以以随机顺序返回,所以我再次返回查找键值对,但它是错误的值,让我无法看清。

也就是说,我看过use jQuery's find() on JSON object并且出于某种原因无法从 openaq.org 提供的对象中获得我需要的东西。

对象的一个​​版本如下所示:

{"meta":{"name":"openaq-api","license":"CC BY 4.0d","website":"https://u50g7n0cbj.execute-api.us-east-1.amazonaws.com/","page":1,"limit":100,"found":1},"results":[{"location":"Metro Lofts","city":null,"country":"US","coordinates":{"latitude":39.731,"longitude":-104.9888},"measurements":[{"parameter":"pm10","value":49.9,"lastUpdated":"2021-08-09T20:49:38+00:00","unit":"µg/m³"},{"parameter":"pm1","value":24,"lastUpdated":"2021-08-09T20:49:38+00:00","unit":"µg/m³"},{"parameter":"um100","value":0,"lastUpdated":"2021-08-09T20:49:38+00:00","unit":"particles/cm³"},{"parameter":"um025","value":0.28,"lastUpdated":"2021-08-09T20:49:38+00:00","unit":"particles/cm³"},{"parameter":"um010","value":4.1,"lastUpdated":"2021-08-09T20:49:38+00:00","unit":"particles/cm³"},{"parameter":"pm25","value":41.1,"lastUpdated":"2021-08-09T20:49:38+00:00","unit":"µg/m³"}]}]}

我正在尝试获取“pm25”值。

我试过的代码是这样的:

function getAirQualityJson(){
    $.ajax({
      url: 'https://api.openaq.org/v2/latest?coordinates=39.73915,-104.9847',
      type: 'GET',
      dataType: "json"
     // data: data ,
  }).done(function(json){
 console.log("the json is" + JSON.stringify(json));
 console.log("the json internal is" + JSON.stringify(json.results));
 var obj = json.results;
 var pm25 = "";
 //console.log(JSON.stringify(json.results.measurements[0]["parameter"]));
 $.each(json.results[0], function(i,items){
   //console.log("obj item:" + JSON.stringify(obj[0].measurements));
    $.each(obj[0].measurements, function(y,things){
    //console.log("each measurement:" + JSON.stringify(obj[0].measurements[0].value));//get each measurement
    //pm 2.5
    //Can come back in random order, get value from the key "pm25" 
    // pm25 = JSON.stringify(obj[0].measurements[2].value);
    pm25 = JSON.stringify(obj[0].measurements[0].value); 

console.log("pm25 is: " + pm25); // not right
  });
});

//Trying Grep and map below too.  Not working
jQuery.map(obj, function(objThing) 
{ console.log("map it 1:" + JSON.stringify(objThing.measurements.parameter));
  if(objThing.measurements.parameter === "pm25"){
     //  return objThing; // or return obj.name, whatever.
       console.log("map it:" + objThing);
  }else{

    console.log("in else for pm25 map");
  }
});


jQuery.grep(obj, function(otherObj) {
  //return otherObj.parameter === "pm25";
  console.log("Grep it" + otherObj.measurements.parameter === "pm25");
});


});
}
getAirQualityJson();

https://jsfiddle.net/7quL0asz/

如您所见,循环通过 I 运行我尝试了 [2],这是 'pm25' 值的原始位置,但随后它切换到第 3 或第 4 个位置,因此它是不可预测的。

我尝试了 jQuery Grep 和 Map,但返回未定义或错误。

所以我的问题是,我将如何解析它以获取“pm25”键值。之后,如果我需要的话,我可以得到其余的。

预先感谢您提供的所有帮助。

最佳答案

您可以使用 array#findoptional chaining为此,

因为我们正在使用可选链,所以如果缺少属性,将返回undefined

演示:

let data = {"meta":{"name":"openaq-api","license":"CC BY 4.0d","website":"https://u50g7n0cbj.execute-api.us-east-1.amazonaws.com/","page":1,"limit":100,"found":1},"results":[{"location":"Metro Lofts","city":null,"country":"US","coordinates":{"latitude":39.731,"longitude":-104.9888},"measurements":[{"parameter":"pm10","value":49.9,"lastUpdated":"2021-08-09T20:49:38+00:00","unit":"µg/m³"},{"parameter":"pm1","value":24,"lastUpdated":"2021-08-09T20:49:38+00:00","unit":"µg/m³"},{"parameter":"um100","value":0,"lastUpdated":"2021-08-09T20:49:38+00:00","unit":"particles/cm³"},{"parameter":"um025","value":0.28,"lastUpdated":"2021-08-09T20:49:38+00:00","unit":"particles/cm³"},{"parameter":"um010","value":4.1,"lastUpdated":"2021-08-09T20:49:38+00:00","unit":"particles/cm³"},{"parameter":"pm25","value":41.1,"lastUpdated":"2021-08-09T20:49:38+00:00","unit":"µg/m³"}]}]}

let found = data?.results?.[0]?.measurements?.find?.(
    ({ parameter }) => parameter === "pm25"
);

console.log(found);

关于javascript - 复杂的 JSON obj 和 jQuery 或 Javascript 映射到特定的键、值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68718793/

相关文章:

javascript - 如何检测文本区域值何时被脚本更改?

javascript - 在 Backbone.js View 中动态设置 id 和 className

javascript - 一个字段 javascript 中缺少以美分计的零

jquery - 这用 jquery 选择了错误的元素

ios - 处理来自 JSON 的空值

java - org.json.JSONException : Value Connection of type java. lang.String 无法转换为 JSONObject

javascript - 强制用户从 JQuery UI 自动完成中选择并在选择后填充隐藏字段

javascript - bxslider 下一个/后退按钮出现在 Bootstrap 导航菜单中

javascript - Jstree issue- 只执行一次

json - 在 Ansible 中过滤 JSON 文档