将数组转换为哈希红宝石



我有一个包含以下内容的数组:

[["< start >", "The   < object >   < verb >   tonight."], 
 ["< object >", "waves", "big    yellow       flowers", "slugs"]]

我想创建一个会返回的哈希

{"< start >"=>[["The", "< object >", "< verb >", "tonight."]], 
 "< object >"=>[["waves"], ["big", "yellow", "flowers"], ["slugs"]]}

我想做某种匹配key.to_s.match(/<?>/),但我不确定如何实现。完整的菜鸟

arr = [["< start >", "The   < object >   < verb >   tonight."], 
       ["< object >", "waves", "big    yellow       flowers", "slugs"]]
arr.each_with_object({}) { |(first, *rest),h|
  h[first] = rest.map { |s| s.scan(/< S+ >|S+/) } }
  #=> {"< start > "=>[["The", "< object >", "< verb >", "tonight."]],
  #    "< object >"=>[["waves"], ["big", "yellow", "flowers"], ["slugs"]]}.

你需要稍微改变你的输入,但你可能想要Hash#[](文档)。

例:

arry = [["key1", "val1"], ["key2", "val2"]]
Hash[arry]
 # => {"key1"=>"val1", "key2"=>"val2"} 

因此,您需要将数组调整为键和值对的数组。

input = [
  ["< start >", "The   < object >   < verb >   tonight."],
  ["< object >", "waves", "big    yellow       flowers", "slugs"]
]
massaged_input = input.map{|arry| [arry.slice!(0), arry.join.squeeze(" ")] }
 # => [["< start >", "The < object > < verb > tonight."], ["< object >", "wavesbig yellow flowersslugs"]]    
Hash[massaged_input]
 # => {"< start >"=>"The < object > < verb > tonight.", "< object >"=>"wavesbig yellow flowersslugs"} 

这就是我将如何处理这个特定示例

a = [["< start >", "The   < object >   < verb >   tonight."], 
 ["< object >", "waves", "big    yellow       flowers", "slugs"]]
a.each_with_object({}) { |(k,*v), obj| obj[k] = v.map { |a| a.scan(/<sw+s>|w+/) } } 
#=> {"< start >"=>[["The", "< object >", "< verb >", "tonight"]], 
#    "< object >"=>[["waves"], ["big", "yellow", "flowers"], ["slugs"]]}

这只是使用一个简单的正则表达式将字符串解析为请求的格式。

代码示例

正则表达式:/<sw+s>|w+/

  • 匹配<sw+s>
    • <(文字)
    • s空间
    • w+一个或多个单词字符(字母、数字、下划线)
    • s空间
    • >(文字)
  • |
  • 匹配w+一个或多个单词字符(字母、数字、下划线)

正则表达式示例

最新更新