Arrays 在Ruby中将键值对数组转换为哈希

Arrays 在Ruby中将键值对数组转换为哈希,arrays,ruby,hash,key-value,Arrays,Ruby,Hash,Key Value,我在数组中有一些数据集,如下所示: array = [ "Name = abc", "Id = 123", "Interest = Rock Climbing" ] 我需要将其转换为哈希,如下所示: hash = { "Name" => "abc", "Id" => "123", "Interest" => "Rock Climbing" } 我一定是做错了什么,因为我的.shift.split得到了奇怪的映射,导致{“Name=abc”=>“Id=123”}。谢谢。您可以

我在数组中有一些数据集,如下所示:

array = [ "Name = abc", "Id = 123", "Interest = Rock Climbing" ]
我需要将其转换为哈希,如下所示:

hash = { "Name" => "abc", "Id" => "123", "Interest" => "Rock Climbing" }
我一定是做错了什么,因为我的.shift.split得到了奇怪的映射,导致{“Name=abc”=>“Id=123”}。谢谢。

您可以这样做(使用):

如果您发现理解带有对象的
每个\u有点困难,您可以用一种简单的方法(只需在
结果\u散列中累积
):


您只需将数组的每个部分拆分为一个键和值(生成一个由两个元素数组组成的数组),然后将结果传递给方便的
Hash[]
方法:

arr = [ "Name = abc", "Id = 123", "Interest = Rock Climbing" ]

keys_values = arr.map {|item| item.split /\s*=\s*/ }
# => [ [ "Name", "abc" ],
#      [ "Id", "123" ],
#      [ "Interest", "Rock Climbing" ] ]

hsh = Hash[keys_values]
# => { "Name" => "abc",
#      "Id" => "123",
#      "Interest" => "Rock Climbing" }
对于2.0之前的Ruby版本(引入时),将
[s.split(/\s*=\s*/)].h
替换为
散列[[s.split(/\s*=\s*/)]]
。 步骤如下:

enum = array.each_with_object({})
  #=> #<Enumerator: ["Name = abc", "Id = 123",
  #     "Interest = Rock Climbing"]:each_with_object({})>
enum
的第一个元素被传递到块,块变量被分配:

s,h = enum.next
  #=> ["Name = abc", {}] 
s #=> "Name = abc" 
h #=> {} 
并且执行块计算:

h.update([s.split(/\s*=\s*/)].to_h)
  #=> h.update([["Name", "abc"]].to_h) 
  #   {}.update({"Name"=>"abc"})
  #   {"Name"=>"abc"}
这是
h
的更新值

传递到块的
enum
的下一个元素是:

s,h = enum.next
  #=> ["Id = 123", {"Name"=>"abc"}] 
s #=> "Id = 123" 
h #=> {"Name"=>"abc"} 

h.update([s.split(/\s*=\s*/)].to_h)
  #=> {"Name"=>"abc", "Id"=>"123"}
等等。

试试这个

array.map {|s| s.split('=')}.to_h

=> {"Name "=>" abc", "Id "=>" 123", "Interest "=>" Rock Climbing"} 

这是最好的答案。我尝试了上面的代码,它给出了以下错误
错误的数组长度为20(预期为2,为3)
有人能帮我解决这个问题吗。同样的代码只在一些罕见的情况下对我不起作用,但是我看不到工作和非工作情况的值有什么不同。@VinitSharma
Hash[]
方法需要成对的数据,即每个元素有两个数组的数组,如
[[key1,val1],[key2,val2],…]
。错误告诉您其中一个数组有三个元素而不是两个。是的,您是对的,我的源字符串创建不正确,因为一个空格包含两个以上的元素。删除了空白,现在可以工作了。谢谢你的帮助!
s,h = enum.next
  #=> ["Name = abc", {}] 
s #=> "Name = abc" 
h #=> {} 
h.update([s.split(/\s*=\s*/)].to_h)
  #=> h.update([["Name", "abc"]].to_h) 
  #   {}.update({"Name"=>"abc"})
  #   {"Name"=>"abc"}
s,h = enum.next
  #=> ["Id = 123", {"Name"=>"abc"}] 
s #=> "Id = 123" 
h #=> {"Name"=>"abc"} 

h.update([s.split(/\s*=\s*/)].to_h)
  #=> {"Name"=>"abc", "Id"=>"123"}
array.map {|s| s.split('=')}.to_h

=> {"Name "=>" abc", "Id "=>" 123", "Interest "=>" Rock Climbing"}