Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从数组中选取键值对_Arrays_Ruby - Fatal编程技术网

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)>]