上下文:我已使用d3成功将CSV文件读取到数组中。数据由个人ID(多次出现)和与ID关联的一项(A,B,C,D,E,F,G中的一项)组成。我想以类似直方图的方式总结这些数据:我想创建一个2D关联数组,该数组针对每个ID和每个项目,在包含该ID的所有数据行中存储该项目的频率。 ID从0到n并不是连续的,而是随机数,这就是为什么我也要对第一维使用关联数组而不是普通数组的原因。
以下代码可以正常工作,并且至少在我点击 expand 符号时返回 console.log(results)所需的内容。
。但是,调用 console.log(results [0])无效,其中0是结果数组中的现有键,正如我应该看到的那样控制台。
关于SO的问题非常相似,答案是使用 Object.keys(results)或 JSON.stringify(results)。但是这些对我也不起作用(请参阅代码)。
我很困惑。在Python或Java中,这将是世界上最简单的事情。为什么在JavaScript中不起作用?而我该如何运作呢?
var results = {};
d3.csv("data.csv", data => {
data.forEach(row => {
if (!(row["id"] in results)) {
results[row["id"]] = {"A": 0, "B": 0,"C": 0, "D": 0, "E": 0, "F": 0, "G": 0};
}
results[row["id"]][row["category"]]++;
});
});
console.log(results);
// {}
// on expansion:
// 0: {A: 1, B: 5, C: 0, D: 0, E: 0, ...}
// 1: {A: 0, B: 3, C: 0, D: 1, E: 0, ...}
// ...
console.log(results[0]);
// undefined
console.log(results["0"]);
// undefined
console.log(Object.keys(results));
// []
// on expansion:
// length: 0
console.log(JSON.stringify(results));
// {}
// not expandable
data.csv 的示例:
id,category
0,A,
0,B,
0,C,
0,C,
0,C,
1,D,
2,D,
2,E,
5,A,
5,B,
5,C,
解决方案:
Quentin是正确的,这是关于异步性的,但是我想指出如何修改特定的代码:
问题在于: console.log 是在计算结果之前执行的,因为 forEach()是异步函数,而 d3.csv ()也是一个异步函数。控制台很有趣:单击扩展按钮时,由于已经过去了几秒钟,因此已经计算出结果。
代码:
var results = {};
d3.csv("data.csv", data => {
for (key in Object.keys(data)) {
row = data[key];
if (!(row["id"] in results)) {
results[row["id"]] = {"A": 0, "B": 0,"C": 0, "D": 0, "E": 0, "F": 0, "G": 0};
}
results[row["id"]][row["category"]]++;
}
console.log(results);
// 0: {A: 1, B: 5, C: 0, D: 0, E: 0, ...}
// 1: {A: 0, B: 3, C: 0, D: 1, E: 0, ...}
// ...
console.log(results[0]);
// {A: 1, B: 5, C: 0, D: 0, E: 0, ...}
// do all the consequent data processing in here
});