如何访问嵌套的JSON对象键和值

3
我正在尝试像这样访问嵌套数组的键和值:
var obj = $.getJSON("mydata.json", function() {
    console.log( "load success" );
});

Object.keys(obj[2].type).forEach(function(key) {
    console.log(key, obj[key]);
});

但是我遇到了一个错误。

这是JSON文件的结构:

{
"nodes": [
    {
        "nd": "nd1",
        "cat": "cat1"
    }
],
"links": [
    {
        "id": 100
    }
],
"types": [
            {
                "type": "one",
                "image": "image001"
            },
            {
                "type": "two",
                "image": "image002"
            },
            {
                "type": "three",
                "image": "image003"
            }
        ]   

我的目标是获取以下数值列表:

一 二 三


你遇到了什么错误? - Vitalii Strimbanu
var vals = obj.types.map((x) => x.image; }); - Stan
对象中没有键2 - Dimitri
6个回答

3
您可以使用以下代码实现:

var obj = {
"nodes": [
    {
        "nd": "nd1",
        "cat": "cat1"
    }
],
"links": [
    {
        "id": 100
    }
],
"types": [
            {
                "type": "one",
                "image": "image001"
            },
            {
                "type": "two",
                "image": "image002"
            },
            {
                "type": "three",
                "image": "image003"
            }
        ]   
};

Object.keys(obj["types"]).forEach(function(key) {
    console.log(obj["types"][key].image);
});


1

类似这样吗?

您需要首先访问对象的types属性,然后在其上进行迭代以检索每种类型。

var object = {
  "nodes": [{
    "nd": "nd1",
    "cat": "cat1"
  }],
  "links": [{
    "id": 100
  }],
  "types": [{
    "type": "one",
    "image": "image001"
  }, {
    "type": "two",
    "image": "image002"
  }, {
    "type": "three",
    "image": "image003"
  }]
};


function parseJson(object){
    object.types.forEach(function(key) {
      console.log(key.type);
    });
}

parseJson(object);

--- 在评论中更新答案 ---

您可以将代码封装在一个函数中,在加载json时调用该函数:

$.getJSON("mydata.json", function(data) {
    parseJson(data);
});

这个可以运行,但是如何从外部文件加载它呢?我该如何使用getJSON命令来实现呢? - passion

1

Object.keys(obj[2].type)在这里并没有太多意义。您不是在迭代任何对象的属性,而是在访问一组对象中的相同属性。这就是map所做的。

var types = obj.types.map(x => x.type);

map(x => x.type)是TypeScript的语法吗? - Vitalii Strimbanu
@VitaliiStrimbanu:可能也包括这个,但它还是 EcmaScript 6。 - David Hedlund

1

$.getJSON返回一个promise,因为它是异步的,但您可以在回调函数中设置变量:

var obj;
$.getJSON("mydata.json", function(data) {
    obj = data;
    Object.keys(obj[2].type).forEach(function(key) {
        console.log(key, obj[key]);
    });
});

文档链接


1
你应该发布你所得到的错误,但我可以告诉你的问题是你的输出代码在JSON对象加载之前执行了。 尝试这样做:
$.getJSON("mydata.json", function(obj) {
    console.log( "load success" );
    Object.keys(obj[2].type).forEach(function(key) {
        console.log(key, obj[key]);
    });
});

0
这是一种在JavaScript中实现的功能性方法:
    var types = $.getJSON("mydata.json").done(function(response) {
       return Object.keys(data["types"]).map(function(element){
            return element.type;
        }).join(' ');
    });            

   console.log(types);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接