假设我有这个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)
您可以在累积计数时使用 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)