为什么push()在循环中不起作用?

时间:2014-08-01 13:52:15

标签: javascript arrays d3.js dynamic-arrays

我有一些代码:

  var cdata = [];

  d3.text("tests.info", function(text) {
    var data = d3.csv.parseRows(text);
    data.forEach(function(d) {
        cdata.push({key: d[0],values: []}
      );
    });
  });

它正在读取CSV文件,然后在将它们添加到数组之前循环通过这些行。我已经使用日志来查看数据是否正确添加,所以这很好。

问题是,如果我之后尝试访问该数组,它就是空的,好像数据从未被添加(虽然我知道这不是真的)。​​

我认为这与范围界定有关,但我认为push()无论如何都应该以这种方式运作。

2 个答案:

答案 0 :(得分:2)

尝试在超时功能中console.log,或者放一个显示cdata内容的按钮,你会发现它不是空的。正如Pointy所说,发生的事情是:

  • 您声明cdata

  • 您开始加载test.info

  • 您显示cdata的内容

  • test.info已加载,您开始循环并将数据放入数组中

答案 1 :(得分:0)

您需要返回cdata

d3.text("tests.info", function(text) {
  var data = d3.csv.parseRows(text), cdata = [];
  data.forEach(function(d) {
    cdata.push({key: d[0],values: []};
  });
  return cdata;
});

也考虑一下

d3.text("tests.info", function(text) {
  return d3.csv.parseRows(text).map(function(d) {
    return {key: d[0], values: []};
  });
});