使用d3.js计算CSV文件的行数

phi*_*ple 6 javascript d3.js

假设我有这个CSV文件

Day,What
2013-10-27,Apple
2013-10-27,Cake
2013-10-27,Apple
2013-10-28,Apple
2013-10-28,Apple
2013-10-28,Blueberry
2013-10-28,Orange
Run Code Online (Sandbox Code Playgroud)

我想用D3.js绘制一个时间序列图.我需要做的就是显示每天的行数总和.例如,11月27日应该有3个值,第28个应该有4个.

有没有办法存档呢?我一直在尝试用CSV创建一个没有正面结果的新数据集.

var dataset;

d3.csv("data.csv", function(d) {
  return {
    Day: new Date(d.Day),
    What: d.What
  };
}, 

function(error, rows) {
    dataset = rows;
    // I SUPPOSE THE FUNCTION THAT GENERATE THE NEW DATASET SHOULD GO THERE     
});
Run Code Online (Sandbox Code Playgroud)

Sco*_*ron 2

您可以在累积计数时使用 JavaScript 对象属性的快速查找作为索引:

var counts = {};
rows.forEach(function(r) {
    if (!counts[r.Day]) {
        counts[r.Day] = 0;
    }
    counts[r.Day]++;
});
Run Code Online (Sandbox Code Playgroud)

然后您需要将其转换回数组,以便可以将其与 D3 一起使用:

var data = [];
Object.keys(counts).forEach(function(key) {
    data.push({
        day: key,
        count: counts[key]
    });
});
Run Code Online (Sandbox Code Playgroud)

我在这里假设您想忽略“什么”列,因为您只讨论了聚合天数,并且同一天有不同的“什么”值。counts如果您想在计数时考虑“什么”,您可以将其构建到原始对象 ( )的键中r.Day + r.What

编辑:根据注释,添加带有复合键的代码。

var counts = {};
rows.forEach(function(r) {
    var key = r.Day + r.What;
    if (!counts[key]) {
        counts[key] = {
           day: r.Day,
           what: r.What,
           count: 0
        };
    }
    counts[key].count++;
});

var data = [];
Object.keys(counts).forEach(function(key) {
    data.push(counts[key]);
});
Run Code Online (Sandbox Code Playgroud)