访问 Javascript json 嵌套对象

Accessing Javascript json nested object

我有一个 json 看起来像这样

{
  "1": {
    "average percent match": 0.2916666667, 
    "match counts": 1.0, 
    "confidence": 0.25
  }, 
  "0": {
    "average percent match": 0.25, 
    "match counts": 1.0, 
    "confidence": 0.25 
  },
}

我尝试通过这种方式访问​​ json 中的值。

JSON.stringify(tlist.toString("utf8"))

        for(var i = 0; i < tlist.length; i++){
        var totalCity = tlist[i]['match counts'];
        console.log(totalCity)
      } 

但我收到一条错误消息,提示未定义。谁能指出问题所在?

谢谢。

输入对象不是数组(或类似对象的数组)。因此它没有任何 属性 称为 length。它只是一个带有 key/value 对的对象字面量。所以你必须像对待所有其他有效的 json 一样解析它,然后循环遍历它的键,如下所示:

var input = "{\"1\": { \"average percent match\": 0.2916666667, \"match counts\": 1.0, \"confidence\": 0.25  }, \"0\": { \"average percent match\": 0.25, \"match counts\": 1.0, \"confidence\": 0.25 } }";

var obj = JSON.parse(input);

for(var key in obj){
    var totalCity = obj[key]['match counts'];
    console.log(totalCity);
}

更新

通常,当我们遍历对象的键时,正如帕特里克在他的评论中正确指出的那样,我们遵循以下模式:

for(var key in obj){
    if(obj.hasOwnProperty(key)){
        // ....
    }
}

我们确实需要这个额外的检查,以避免在 obj 的原型链中枚举在对象上定义的属性。在这种情况下,由于您的对象是一个简单的对象,其 proto 是对象,因此不需要这样做。这就是我没有包含它的原因。

要对此进行深入分析,请查看以下链接:

那不是数组。您必须使用它的密钥才能访问。

var x = {
  "0": {a: 'b'},
  "1": {a: 'b'},
}

for(key in x) {
  console.log(x[key]) //outputs {a: 'b'}
}

您对象中的键值 string 输入:

{   // Keys wrapped in "" are strings
    "1": { ... },
    "2": { ... }
}

即使javascript是一种非严格类型语言,它仍然有内部类型,对象不会尝试转换访问键类型,它们会对键进行严格检查以确定是否存在。当进行严格检查时,不仅要考虑值,还要考虑类型;这是 ===== 之间的区别,对于 === 评估为 true 值和类型都必须匹配。

但是当您在循环中访问它们时,您正在尝试使用 number 类型进行访问:

// i is defined as the number 0, and incremented by 1 on each iteration
for(var i = 0; i < tlist.length; i++){
    var totalCity = tlist[i]['match counts'];
    ...
}

不过不用担心,您仍然可以保持循环,只需要在访问对象时将 i 转换为正确的类型即可!

for(var i = 0; i < tlist.length; i++){
    // Adding an empty string to a number will convert said number into a string
    var totalCity = tlist[i + '']['match counts'];
    ...
}

这会起作用:请将 link 添加到 jquery,或使用下面的脚本 link。

<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> 

var data = {
           "1": {
               "average percent match": 0.2916666667,
               "match counts": 1.0,
               "confidence": 0.25
           },
           "0": {
               "average percent match": 0.25,
               "match counts": 1.0,
               "confidence": 0.25
           },
       }
       var total =0;
       $.each(data, function (i, item) {
           total += item["match counts"];
       });
       alert("Total of match counts is: " + total);