[数组的形成和定制

问题描述 投票:-1回答:2
[[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 pm-9pm很常见,因此将其添加并合并为一个。

任何优化解决方案?

ruby ruby-on-rails-5
2个回答
1
投票

由于您到目前为止还没有显示您所做的任何事情,因此实际上没有优化可以提供给您。

对于预期的输出,您可以将数组按第一个元素分组,然后将结果映射到一个数组数组,其中第一个元素是时间范围(“ 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]]

0
投票
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形式,称为默认值。有时称为counting hash

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

h[k] = h[k] + 1

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

h[k] = 0 + 1

因为等式右边的h[k]返回默认值零。 h具有键k后,等式右侧的h[k]会简单地返回k的值。

[您是否想知道为什么当h[k]没有键h时,等式右边的k会返回默认值,请记住表达式h[k] = h[k] + 1是简写的

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

采用方法Hash#[]=Hash#[]。当使用值k(不是哈希键之一)求值时,这是后面的方法返回默认值。

© www.soinside.com 2019 - 2024. All rights reserved.