mbostock最近回答了关于使用d3数据的最佳实践的问题,这里是帖子的链接;
https://github.com/d3/d3/issues/2828
然而,试图遵循他的建议我仍然困惑如何迭代他建议的多维数据。我现在只是试图控制记录数据,并希望有人可以帮助我在帖子后面制作实际例子,相关的片段可以在下面看到;
你可以有一个单独的国家数组,然后需要一个二维数组值,类似于用来避免冗余指定日期的技巧。实际上,您可以将其概括为组织,国家和日期的n维矩阵:
{
"organizations": ["EA", "EB", "EC"],
"countries": ["Netherlands", "Belgium", "France"],
"dates": ["Jan_2016", "Feb_2016", "Mar_2016"],
"values": [
[
[11.7999, 15.0526, 13.2411],
[25.7713, 24.1374, null],
[27.6033, 23.6186, 20.2142]
],
[
[11.7999, 15.0526, 13.2411],
[25.7713, 24.1374, null],
[27.6033, 23.6186, 20.2142]
]
]
}
我希望这是最简洁的,但是在访问数据时你必须记住维度顺序:
var organization = "EA",
country = "Netherlands",
date = "Jan_2016",
value = data.values[organization][country][date]; // 11.7999
我一直试图了解如何实现这一结果,但由于我对这一切相对较新,因此很难实现。我找到的最有用的资源是> video1 + video2并尝试使用此guide作为参考。
我仍然没有明白如何真正做到这一点,我不确定它是不是可能与数据结构mbostock建议或我是否只是遗失了一些东西(读:很多)? (我99.99%肯定它是后者)。
所以这就是我想要做的事情;
http://plnkr.co/edit/2O9Gn28WuMCE1ajOonzY?p=preview
d3.json("data.json", function(error, data) {
if (error) {
console.log(error)
} else {
console.log(data)
data = d3.entries(data);
console.log(data)
}
data.forEach(function(d) {
var org = Object.keys(data[0]);
console.log(org)
})
});
所以,从我可以收集的内容中,我需要将json转换为数组,然后生成一系列forEach循环以将所有内容组合在一起。这就是我真正挣扎的事情,任何帮助都会受到高度赞赏。
我希望所有内容都有解释/问题相关,
由于
答案 0 :(得分:2)
在这种情况下,一个好的旧for
循环可能是最明确的方法:
for (var organization=0; organization<data.organizations.length; organization++) {
for (var country=0; country<data.countries.length; country++) {
for (var date=0; date<data.dates.length; date++) {
console.log(data.values[organization][country][date]);
}
}
}
请注意,organization
,country
和date
是整数:您可以使用data.organizations[organization]
来访问实际标签。
有很多灵活性,您可以重新排序循环并添加中间代码。例如,如果要为每个组织和日期提取数组:
for (var organization=0; organization<data.organizations.length; organization++) {
for (var date=0; date<data.dates.length; date++) {
var group = [];
for (var country=0; country<data.countries.length; country++) {
group.push(data.values[organization][country][date]);
}
console.log("values for "+data.organizations[organization]+" at time "+data.dates[date]+":")
console.log(group);
}
}
PS:要获取单个国家/地区(或组织或日期)而不是枚举所有国家/地区,您可以将相应的for
循环替换为:
var country= data.countries.indexOf("france")