我在过滤csv
数据和更新SVG
中的某些D3.js
时遇到了一些问题。
加载时我想从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();
}
根据用户输入(左/右键)我想更改过滤的日期和时间段并更新一些SVG。
例:
现在的日期是:20100903。
用户点击右箭头键,日期更改为YYYYMMDD列中包含20100904的行,周期随之更改,就像我的for循环问题1一样。
我只是坚持这个,因为我不知道如何构建我的代码。
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最终会包含更多数据。
提前感谢您的帮助。
答案 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