【发布时间】:2015-11-29 14:10:58
【问题描述】:
这是问题here 的后续问题。
我想使用d3.csv 和d3.json 加载几个数据集,然后使用d3.zip 组合这些数据集。在下面的示例中,我只使用了两个。第一个数据集将存储在xyData 中,第二个数据集将存储在colData 中。我的目标是调用类似
var combinedData = d3.zip(colData, xyData);
但是,由于这些数据集只能分别在 d3.csv 和 d3.json 范围内访问,因此这是行不通的。有什么解决方法吗?如果要加载更多数据集,该如何处理?
第一个数据集如下所示:
//xyData.csv
x,y
0,0.00e+000
0.6981317,6.43e-001
1.3962634,9.85e-001
我的JSON 数据集如下所示:
//colData.json
{
"el1": [
{"color": "green"},
{"color": "purple"},
{"color": "brown"}
],
"el2": [
{"color": "black"},
{"color": "red"},
{"color": "yellow"}
],
"el3":[
{"color": "brown"},
{"color": "yellow"},
{"color": "blue"}
]
}
我读取这些数据集如下:
//using foreach
var xyData = [];
d3.csv("xyData.csv", function(myData) {
myData.forEach(function(d) {
d.x = +d.x; //convert data to numbers
d.y = +d.y;
});
console.log(myData[1]);
xyData = myData;
console.log(xyData[1])
});
console.log(xyData) //this will be an empty array
//loading the json data
var colData = [];
d3.json("colData.json", function(error, jsonData) {
if (error) return console.warn(error);
colData = jsonData;
console.log(colData)
console.log(colData.el1[0])
});
console.log(colData) //this will be an empty array
//my goal would be:
//var combinedData = d3.zip(colData, xyData);
我的console.log 看起来像这样:
Array [ ]
Array [ ]
Object { x: 0.6981317, y: 0.643 }
Object { x: 0.6981317, y: 0.643 }
Object { el1: Array[3], el2: Array[3], el3: Array[3] }
Object { color: "green" }
这表明加载数据按预期工作。但是由于这些数据加载器的异步特性,将它们存储为全局变量不起作用(因此,这两个数组仍然是空的)。
我的问题是:将两个数据集组合成一个数据集的最佳方法是什么?
【问题讨论】:
-
您遇到了经典的“我如何从异步调用中返回数据”问题,答案是 - 您不能。您必须在回调中完成所有工作,不能在回调中设置变量然后在回调之外进行工作。除了 D3,您还使用其他库吗?哪个?也许是 jQuery?
-
@LarsKotthoff:我看到了这个问题,也应该提到它。那么你如何处理两个以上的输入文件呢?然后你会创建一个巨大的嵌套结构吗?
-
@Tomalak:我使用了 jQuery,但不是用于非常高级的东西。这整个话题对我来说相当新,所以我确实可能会问一些非常基本的问题。那么您将如何处理大量数据文件?创建一个巨大的嵌套结构?还是先将 CSV 文件和 JSON 文件合并为一个 JSON 文件更合理?
-
@Cleb 对于 2 个或更多文件,最好的解决方案是使用 queue.js。
标签: javascript json csv d3.js scope