我正在尝试使用ChartsJS来描绘一段时间内的粉丝图表。 我已经使用效率较低的方法使用了图表。
数据:一行日期(每次关注发生时)
dates = ['Mar 15', 'Mar 16', 'Mar 18', 'Mar 18']
图表采用日期数组和每个日期的值。
目标是使上述内容如下所示:
graph = [['Mar 14','Mar 15', 'Mar 16', 'Mar 17', 'Mar 18'],[0,1,2,2,4]]
现在,我的程序从图形中的第一个日期开始,检查日期中是否有值匹配,然后增加存储的值。
在做了一些研究之后,我想我应该使用哈希映射来提高效率,但我无法理解我实际上是如何做到这一点的。
我的答案中并不特别需要代码片段,只是对我实际应该做的事情的快速解释。
任何和所有帮助都非常感激。
答案 0 :(得分:1)
您正在寻找的是JavaScript对象。从你的例子:
graph = {
'Mar 14': 0,
'Mar 15': 1,
'Mar 16': 2,
'Mar 17': 2,
'Mar 18': 4
};
然后,您可以使用for (var date in graph) {...}
循环键。
编辑:根据评论,问题似乎与实际计算图表值有关。
解决问题的一种方法是首先计算日期数组['Mar 14', 'Mar 15', ..., 'Mar 18']
。如何最好地做到这一点取决于天的范围有多大(即,它可以跨越不同的月份?)。您可能希望以不同的方式表示日期,这使得计算更容易。我们将此数组称为dateRange
。
其次,您可以解析数组以创建从每天发生的地图到当天发生的跟随数。即。
var follows = {};
for (var date in dates) {
if (follows[date]) {
follows[date] += 1;
} else {
follows[date] = 1;
}
}
使用它可以通过保持运行总和来获得第二个数组:
var sum = 0;
var sums = [];
for (var dates in dateRange) {
if (dates in follows) {
sum += follows[dates];
}
sums.push(sum);
}
此总和将包含与步骤1中创建的日期范围对应的关注者。
答案 1 :(得分:0)
例如,您可以
follow_count_on_dates = @follows.map {|f| f.created_at.change(hour: 0)}.each_with_object(Hash.new(0)) {|follow_date,hash| hash[follow_date.strftime("%b %d")]+=1 }
这将为您提供类似
的哈希值{"Mar 19"=>32, "Mar 05"=>2, "Apr 04"=>1, "May 01"=>2, "Apr 06"=>1, "Apr 21"=>1, "Apr 22"=>1, "May 04"=>3}
然后您可以将其注入DOM并在JS中使用
首先,我们映射您的@follows
ActiveRecord对象,以便created_at
属性具有完全相同的小时,因此我们只能使用几天。这将返回一个包含大量重复日期的数组。然后链接到我们调用each_with_object
来使用Hash进行迭代,该Hash使用0
(我们发送的对象)进行初始化,将密钥设置为使用created_at
解析的strftime("%b %d")
对象,增加内部的值(由于每次看到另一个相等的日期时都传递Hash.new(0)
,因此从零开始。
顺便说一句,你也不应该使用带有年份值的strftime吗?