如何正确实现哈希映射/我甚至需要一个

时间:2015-05-11 16:00:47

标签: javascript ruby-on-rails hashmap

我正在尝试使用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]]

现在,我的程序从图形中的第一个日期开始,检查日期中是否有值匹配,然后增加存储的值。

在做了一些研究之后,我想我应该使用哈希映射来提高效率,但我无法理解我实际上是如何做到这一点的。

我的答案中并不特别需要代码片段,只是对我实际应该做的事情的快速解释。

任何和所有帮助都非常感激。

2 个答案:

答案 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)

编辑:根据您的意见,这些数据来自您的Rails后端。而不是在前端操作它,最好在Rails中设置它。

例如,您可以

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吗?