d3.js数据数组if语句

时间:2016-03-15 09:40:00

标签: d3.js linechart

我正在尝试取消y值为>的行5000。 这是包含来自csv文件的所有数据的图表:

http://dtech.id.lv/d3/origin.html

这是我尝试用if语句修改forEach函数:

http://dtech.id.lv/d3/modif.html

// Get the data
    d3.csv("data.csv", function(error, data) {
        data.forEach(function(d) {

            if (d.close < 5000) {
                less5000++;
      d.close = +d.close;
      d.date = parseDate(d.date);
            }
    if (d.close > 5000) {
                over5000++;
            }

    total++;

        });

有些东西不在这里,我无法弄清楚如何正确地写这个。 有人可以指点我这样做的正确方法吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

错误发生在其他地方:

您的几个数据条目的日期格式错误,因此您的valueline方法中的x(d.date)会返回无法显示的NaN,并且d3会崩溃(请参阅http://dtech.id.lv/d3/modif.html处的JS控制台)。

这就是你的第一个数据条目的样子,这很好:{dd: "2016-03-13", date: Mon Jan 01 1900 00:00:03 GMT+0100 (CET), close: 131}

...这就是数据集中无效的内容:{dd: "2016-03-13", date: "10:54:43", close: "10465"}

在data.csv中有大约20个数据条目具有无效的日期对象

<强>更新

上面的行为是因为,如果d.close为5000或更高,则不解析d.date。将代码更新为

// Get the data
d3.csv("data.csv", function(error, data) {
     data.forEach(function(d) {
         if (d.close < 5000) {
              less5000++;
         }
         if (d.close > 5000) {
              over5000++;
         }

         d.close = +d.close;
         d.date = parseDate(d.date);

         total++;
     });
...

更新2

要过滤您的数组,请使用 array .filter(请参阅:https://github.com/mbostock/d3/wiki/Arrays)! 在你的情况下:

// Get the data
d3.csv("data.csv", function(error, data) {
     data = data.filter(function(d){
          d.close = +d.close;
          d.date = parseDate(d.date);

          return d.close < 5000;
     });
...

数据只包含d.close小于5000的条目。