Arrays 从数组中选取键值对
我有一个像这样的数组Arrays 从数组中选取键值对,arrays,ruby,Arrays,Ruby,我有一个像这样的数组 [ "---\n", ":date: 2018-07-31\n :estimated_hours: 4.0\n :remaining_hours: 4.0\n ", ":date: 2018-08-01\n :estimated_hours: 4.0\n :remaining_hours: 4.0\n ", ":date: 2018-08-22\n :estimated_hours: 4.0\n :remaining_hours: 0.0\n "
[
"---\n",
":date: 2018-07-31\n :estimated_hours: 4.0\n :remaining_hours: 4.0\n ",
":date: 2018-08-01\n :estimated_hours: 4.0\n :remaining_hours: 4.0\n ",
":date: 2018-08-22\n :estimated_hours: 4.0\n :remaining_hours: 0.0\n "
]
我想选择key:date的所有值。我读到我可以使用Enumerableselect,但我不知道怎么做。有人能帮上忙吗?希望这能帮上忙
data = ["---\n", ":date: 2018-07-31\n :estimated_hours: 4.0\n :remaining_hours: 4.0\n ", ":date: 2018-08-01\n :estimated_hours: 4.0\n :remaining_hours: 4.0\n ", ":date: 2018-08-22\n :estimated_hours: 4.0\n :remaining_hours: 0.0\n "]
DATE_REGEX = /:date:\s(.*)\n/
dates = data.map do |record|
record.match(DATE_REGEX)[1] if record.match(REGEX)
end.compact
可以与正则表达式参数一起使用,并且:
或
?由于这看起来非常像YAML,尽管它需要一点消毒,我会选择:
a = [
"---\n",
":date: 2018-07-31\n :estimated_hours: 4.0\n :remaining_hours: 4.0\n ",
":date: 2018-08-01\n :estimated_hours: 4.0\n :remaining_hours: 4.0\n ",
":date: 2018-08-22\n :estimated_hours: 4.0\n :remaining_hours: 0.0\n "
].map(&:rstrip)
require 'yaml'
data = a[1..-1].map {|s| YAML.load(s.gsub(" ", ""))}
#=> [
# {:date=>#<Date: 2018-07-31 ((2458331j,0s,0n),+0s,2299161j)>, :estimated_hours=>4.0, :remaining_hours=>4.0},
# {:date=>#<Date: 2018-08-01 ((2458332j,0s,0n),+0s,2299161j)>, :estimated_hours=>4.0, :remaining_hours=>4.0},
# {:date=>#<Date: 2018-08-22 ((2458353j,0s,0n),+0s,2299161j)>, :estimated_hours=>4.0, :remaining_hours=>0.0}]
data.map {|h| h[:date] }
#=> [#<Date: 2018-07-31 ((2458331j,0s,0n),+0s,2299161j)>,
# #<Date: 2018-08-01 ((2458332j,0s,0n),+0s,2299161j)>,
# #<Date: 2018-08-22 ((2458353j,0s,0n),+0s,2299161j)>]
您将始终有一个soln,但我可以问一下谁正在生成此数组。也许你可以调整它,像使用散列或其他更有意义的东西一样使用它。你从哪里得到这个数组的?看起来,当您应该只使用YAML时,您将YAML文件拆分为新行。解析该文件,然后您将获得适当的哈希和数组。如果您的数组是这样的,让我们尝试下面给定的解决方案。数组是数据库的结果。我在数据库中有一个文本列,它将所有这些信息存储在一个列中。我已经把它带到了应用层,现在我需要按日期列分组,并继续进一步的功能。我将尝试下面的解决方案,并让您知道。感谢您的帮助也许,OP希望对结果应用展平,但这并不重要。更改为arr.join.scan/:date:\d{4}-\d{2}-\d{2}/.flatte以匹配OP的预期结果您不需要/:date:\s.\n/?要使捕获组的匹配不贪婪,那么匹配将在字符串中的第一行而不是最后一行结束?
arr = ["---\n",
":date: 2018-07-31\n :estimated_hours: 4.0\n :remaining_hours: 4.0\n ",
":date: 2018-08-01\n :estimated_hours: 4.0\n :remaining_hours: 4.0\n ",
":date: 2018-08-22\n :estimated_hours: 4.0\n :remaining_hours: 0.0\n "]
arr.join.scan(/:date: (\d{4}-\d{2}-\d{2})/).flatten
#=> ["2018-07-31", "2018-08-01", "2018-08-22"]
arr.join.scan(/(?<=:date: )\d{4}-\d{2}-\d{2}/).flatten
#=> ["2018-07-31", "2018-08-01", "2018-08-22"]
arr.join.gsub(/(?<=:date: )\d{4}-\d{2}-\d{2}/).to_a
#=> ["2018-07-31", "2018-08-01", "2018-08-22"]
a = [
"---\n",
":date: 2018-07-31\n :estimated_hours: 4.0\n :remaining_hours: 4.0\n ",
":date: 2018-08-01\n :estimated_hours: 4.0\n :remaining_hours: 4.0\n ",
":date: 2018-08-22\n :estimated_hours: 4.0\n :remaining_hours: 0.0\n "
].map(&:rstrip)
require 'yaml'
data = a[1..-1].map {|s| YAML.load(s.gsub(" ", ""))}
#=> [
# {:date=>#<Date: 2018-07-31 ((2458331j,0s,0n),+0s,2299161j)>, :estimated_hours=>4.0, :remaining_hours=>4.0},
# {:date=>#<Date: 2018-08-01 ((2458332j,0s,0n),+0s,2299161j)>, :estimated_hours=>4.0, :remaining_hours=>4.0},
# {:date=>#<Date: 2018-08-22 ((2458353j,0s,0n),+0s,2299161j)>, :estimated_hours=>4.0, :remaining_hours=>0.0}]
data.map {|h| h[:date] }
#=> [#<Date: 2018-07-31 ((2458331j,0s,0n),+0s,2299161j)>,
# #<Date: 2018-08-01 ((2458332j,0s,0n),+0s,2299161j)>,
# #<Date: 2018-08-22 ((2458353j,0s,0n),+0s,2299161j)>]