0

我正在尝试从 JSON 文件中的数据创建一个带有 d3 的堆积条形图。每个酒吧都会有特定月份的平局、输球和赢球。

JSON文件:

{
    "name": "FHS",
    "points": 3000,
    "ties": 3,
    "losses": 19,
    "wins": 50,
    "games": {
        "2010-09": { "ties": 1, "losses": 2, "wins": 16 },
        "2010-10": { "ties": 2, "losses": 5, "wins": 13 },
        "2010-11": { "ties": 0, "losses": 12, "wins": 21 }
    }
}

我已经使用 d3.json 功能很好地使用了一些数据。例如:

d3.json("data.json",function(error,data)
    {
        alert(data.name);
        alert(data.points);
        // etc.
    });

但这就是有趣的地方(仅供参考,我正在使用下划线库来获取“游戏”的每个属性......也许这是我出错的地方?)。如果我尝试以下操作:

_.keys(data.games).forEach(function(d)
    {
        alert(d);
    });

我在三个不同的警报框中得到了 2010-09、2010-10、2010-11……完美!但是,如果我尝试以下操作:

_.keys(data.games).forEach(function(d)
    {
        alert(d.ties);
    });

我得到未定义:/事实上,我看到的另一个问题是

alert(data.games.2010-09.ties);

应该可以工作(如果属性名称不是以整数开头或没有连字符......),但不会因为文字的格式(“2010-09”)......所以,我的主要问题是如何以使生成图表变得简单的方式动态访问嵌套对象属性。我已尝试包含足够的上下文,但如果您需要更多信息,请告诉我。提前致谢!

4

2 回答 2

2

您可以将键附在[""]其中以访问该值,即alert(data.games["2010-09"].ties);可以使用。您可能还对使用键值结构的 d3 函数感兴趣;请参阅文档

于 2012-11-03T17:58:39.867 回答
2

您在警报框中得到未定义,因为d在此函数内部,是一个字符串——“2010-09”、“2010-10”、“2010-11”等——因为您正在遍历由_.keys(data.games).

所以,alert(d.ties)就像 call alert("2010-09".ties),这是预期未定义的。

但是,在拉斯解释的基础上,

_.keys(data.games).forEach(function(d)
{
    alert(data.games[d].ties);
});

是您获取数据的方式。

PSconsole.log(data.games[d].ties)是调试 javascript 的更健壮的方式(因此通常是首选方式)。

于 2012-11-04T03:10:12.383 回答