无法访问JavaScript中的关联数组的值

时间:2019-03-09 22:23:45

标签: javascript arrays associative-array

上下文:我已使用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 ()也是一个异步函数。控制台很有趣:单击扩展按钮时,由于已经过去了几秒钟,因此已经计算出结果。

  • 因此,我将异步 forEach 函数更改为普通的 for 循环。
  • 由于d3中没有同步CSV功能,因此我将其余的数据处理代码放在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
});

0 个答案:

没有答案