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)
有人能帮我解决这个问题吗。同样的代码只在一些罕见的情况下对我不起作用,但是我看不到工作和非工作情况的值有什么不同。@VinitSharmaHash[]
方法需要成对的数据,即每个元素有两个数组的数组,如[[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"}