d3.js 数据数组 if 语句

d3.js data array if statement

我正在尝试取消 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++;

        });

这里有些地方不对,我不知道如何正确地写这个。 有人可以指出我这样做的正确方法吗? 谢谢!

错误在别的地方:

您的一些数据条目的日期格式错误,因此 x(d.date) 在您的值线方法中 returns NaN,无法显示并且 d3 崩溃(请参阅您的 JS 控制台 http://dtech.id.lv/d3/modif.html).

这就是您的第一个数据条目的样子,很好:{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"}

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

更新

上述行为是因为,如果 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 的条目。