阵列形成和定制

array formation and customization

[[9am-3pm,15,21,0],[3pm-9pm,21,23,1],[3pm-9pm,0,3,1],[9pm-3am,3,9,1]]

我有这样的数组,结果显示在视图中

9am-3pm       0
3pm-9pm       1
3pm-9pm       1
9pm-3am       1

我希望结果如下所示:

9am-3pm       0
3pm-9pm       2
9pm-3am       1

即下午 3 点到晚上 9 点很常见,因此将其添加并合并为一个。

任何优化解决方案?

由于你到现在为止还没有展示你所做的任何事情,所以真的没有优化可以给你。

对于预期的输出,您可以按第一个元素对数组进行分组,然后将结果映射到数组数组中,其中第一个元素是时间范围 ("Wxm-Yzm"),第二个元素是他们最后一个元素(0, 1, 1, 1)对应的和:

p [['9am-3pm',15,21,0],['3pm-9pm',21,23,1],['3pm-9pm',0,3,1],['9pm-3am',3,9,1]].group_by(&:first).map { |key, value| [key, value.sum(&:last)] }
# [["9am-3pm", 0], ["3pm-9pm", 2], ["9pm-3am", 1]]
arr = [['9am-3pm',15,21,0],['3pm-9pm',21,23,1],
       ['3pm-9pm',0,3,1],['9pm-3am',3,9,1]]

h = arr.each_with_object(Hash.new(0)) { |(period,*),h| h[period] += 1 }
  #=> {"9am-3pm"=>1, "3pm-9pm"=>2, "9pm-3am"=>1}

您可能只想将其保留为散列,但如果您想要问题中显示的数组:

h.to_a
  #=> [["9am-3pm", 1], ["3pm-9pm", 2], ["9pm-3am", 1]] 

参见带有参数的 Hash::new 形式,称为 默认值 。这有时称为 计数哈希 .

Ruby 的解析器将表达式 h[k] += 1 扩展为

h[k] = h[k] + 1

在评估之前。如果 h 没有键 k 此表达式变为

h[k] = 0 + 1

因为h[k]等号右边returns的默认值,零。一旦 h 有一个键 kh[k] 等式右边 returns 键的当前值 k.

h没有键k时,你是否想知道为什么returns等式右边的h[k]是默认值?表达式 h[k] = h[k] + 1 对于

是 shorthand
h.[]=(k, h.[](k) + 1)

它采用了方法 Hash#[]= and Hash#[]。后一种方法是 returns 使用不是散列键之一的值 k 进行评估时的默认值。