问题描述
我正在尝试预处理一些数据。 虽然我的方法行得通,但感觉确实很脏。
// Calculate dataset mean
var mean = Math.round(d3.mean(data, function(d) { return d.value; }));
// Iterate through data reformatting dates and centering data around the mean
data.forEach(function(d) {
parseDate = d3.time.format("%Y-%m-%d").parse;
d.date = parseDate(d.date);
d.value = Math.round(+d.value - mean);
});
var data = data.map(function(obj) { return [obj.date.getTime(), obj.value]; });
我实际上是遍历数据集三次。
首先,计算平均值(仅在下一个循环中使用)。
其次,重新格式化日期字符串,并使数据围绕均值居中。
第三,将日期字符串转换为日期对象(纪元时间)。
与遍历数据集三遍相比,我有一种更有效的方法。
我如何合并这些循环?
1楼
Lars Kotthoff
2
已采纳
2015-07-30 16:08:24
好吧,您需要在第二次迭代中获得均值,因此无法绕开第一次迭代。 您可以轻松地将迭代2和3组合在一起:
var parseDate = d3.time.format("%Y-%m-%d").parse;
var data = data.map(function(d) {
d.date = parseDate(d.date);
d.value = Math.round(+d.value - mean);
return [d.date.getTime(), d.value];
});
除非data
非常大(至少数千个项目),否则不会使其效率明显提高。