在D3.js中过滤CSV的多行并更新键盘输入上的过滤器

时间:2013-09-25 10:54:43

标签: javascript csv svg d3.js

我在过滤csv数据和更新SVG中的某些D3.js时遇到了一些问题。

第1期

加载时我想从csv中过滤掉多行。 我成功加载了数据并只过滤了一行。然后我尝试了多行的类似方法,但这不起作用。

d3.csv("sample-data.csv", function(data){
  date = data.filter(function(row) {
      return row['YYYYMMDD'] == '20100901';
  })

  period = data.filter(function(row){
    for (var i = 1950; i < 2013; i++) {
      return row['YYYYMMDD'] == (i +"0901");
    } 
  });

  createVis();
}

问题2:

根据用户输入(左/右键)我想更改过滤的日期和时间段并更新一些SVG。

例:
现在的日期是:20100903。 用户点击右箭头键,日期更改为YYYYMMDD列中包含20100904的行,周期随之更改,就像我的for循环问题1一样。

我只是坚持这个,因为我不知道如何构建我的代码。

我的csv数据示例:

YYYYMMDD, DDVEC, FHVEC, FG  
20100901, 31, 51, 57
20100902, 245, 20, 51
20100903, 279, 51, 62
20100904, 220, 36, 46
20100905, 284, 26, 41

请注意,我的csv最终会包含更多数据。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

  period = data.filter(function(row){
    for (var i = 1950; i < 2013; i++) {
      return row['YYYYMMDD'] == (i +"0901");
    } 
  });

由于在第一次迭代时将触发return语句,因此无法迭代i的所有值。为了保持您的结构大部分完整,您可以进行一些小修改:

  period = data.filter(function(row){
    for (var i = 1950; i < 2013; i++) {
      if (row['YYYYMMDD'] == (i +"0901")) { return true; }
    }
    return false; 
  });

只有在匹配时才会返回True;如果循环结束且没有匹配,则返回False。

要改进结构,请简化您要检查的内容:

  period = data.filter(function(row){
    var dateNum = +row['YYYYMMDD'];
    return 19500901 <= dateNum && dateNum <= 20130901;
  });

这里,你的字符串日期被转换为一个+的整数,并且完成了简单的算术运算(因为它们使用字典比较而不能对字符串进行)以检查日期是否在范围内。 / p>

理想情况下,您的日期应以actual dates表示 - 如果您的日期格式正确,则一切都会更加轻松。要将日期字符串转换为日期对象:

period.forEach(function(d){
  d.date = d3.format('%Y%m%d').parse(d.date);
})

检查给定行的日期是否符合您指定的标准:

   row.date.getDate() == 1   && row.getMonth() == 8 
&& 1950 <= row.getFullYear() && row.getFullYear() <= 2012