阵列形成和定制
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
有一个键 k
,h[k]
等式右边 returns 键的当前值 k
.
当h
没有键k
时,你是否想知道为什么returns等式右边的h[k]
是默认值?表达式 h[k] = h[k] + 1
对于
是 shorthand
h.[]=(k, h.[](k) + 1)
它采用了方法 Hash#[]= and Hash#[]。后一种方法是 returns 使用不是散列键之一的值 k
进行评估时的默认值。
[[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
有一个键 k
,h[k]
等式右边 returns 键的当前值 k
.
当h
没有键k
时,你是否想知道为什么returns等式右边的h[k]
是默认值?表达式 h[k] = h[k] + 1
对于
h.[]=(k, h.[](k) + 1)
它采用了方法 Hash#[]= and Hash#[]。后一种方法是 returns 使用不是散列键之一的值 k
进行评估时的默认值。