如何在Ruby中重建哈希值

时间:2017-06-02 11:09:49

标签: ruby hash

我有一个带哈希的数组:

arr = [{"name1"=>{"users"=>"{\"root\":{\"Name\":\"root\",\"Home\":\"/root\",\"Status\":\"Active\"},\"bee\":{\"Name\":\"bee\",\"Home\":\"/bee\",\"Status\":\"Active\"}}"}}, 
{"name2"=>{"users"=>"{\"root\":{\"Name\":\"root\",\"Home\":\"/root\",\"Status\":\"Active\"},\"alo\":{\"Name\":\"alo\",\"Home\":\"/alo\",\"Status\":\"Active\"}}"}}]

“users”键的值是一个字符串,必须经过JSON解析,并且根键的下一个值也是。

我想得到这样的东西:

arr = ["name1"=>{"root"=>{"Name"=>"root", "Home"=>"root", "Status"=>"Active"}, "bee"=>{"Name"=>"bee", "Home"=>"bee", "Status"=>"Active"}},
    "name2"=>{"root"=>{"Name"=>"root", "Home"=>"root", "Status"=>"Active"}, "alo"=>{"Name"=>"alo", "Home"=>"alo", "Status"=>"Active"}}]

到目前为止,我已经尝试过:

arr.each do |item|

  item.each do |key, val|

    h[key] = val.values
  end
end

产生哈希:

h = {{"name1"=>["{\"root\":{\"Name\":\"root\",\"Home\":\"/root\",\"Status\":\"Active\"},\"bee\":{\"Name\":\"bee\",\"Home\":\"/bee\",\"Status\":\"Active\"}}"], "name2"=>["{\"root\":{\"Name\":\"root\",\"Home\":\"/root\",\"Status\":\"Active\"},\"alo\":{\"Name\":\"alo\",\"Home\":\"/alo\",\"Status\":\"Active\"}}"]}}

如何重建这些哈希以获取已解析的值并从每个哈希中删除“用户”键?

1 个答案:

答案 0 :(得分:1)

通常情况下,我会要求您开始使用的代码,但我可以看到您为什么不知所措,所以在这里您可以这样做:

require 'json'

arr = [{"name1"=>{"users"=>"{\"root\":{\"Name\":\"root\",\"Home\":\"/root\",\"Status\":\"Active\"},\"bee\":{\"Name\":\"bee\",\"Home\":\"/bee\",\"Status\":\"Active\"}}"}}, 
{"name2"=>{"users"=>"{\"root\":{\"Name\":\"root\",\"Home\":\"/root\",\"Status\":\"Active\"},\"alo\":{\"Name\":\"alo\",\"Home\":\"/alo\",\"Status\":\"Active\"}}"}}]


arr.map! do |user|
  user.map do |key, value|
    h = JSON.parse(value["users"].gsub('/',''))
    Hash[key, h]
  end
end

或者,如果您更喜欢较短的版本:

arr.map!{|user| user.map{|key, value| Hash[key, JSON.parse(value["users"].gsub('/',''))]}}

给出了:

[
  [{"name1"=>{"root"=>{"Name"=>"root", "Home"=>"root", "Status"=>"Active"}, "bee"=>{"Name"=>"bee", "Home"=>"bee", "Status"=>"Active"}}}], 
  [{"name2"=>{"root"=>{"Name"=>"root", "Home"=>"root", "Status"=>"Active"}, "alo"=>{"Name"=>"alo", "Home"=>"alo", "Status"=>"Active"}}}]
]

Hash[key, value]可让您使用键值对映射新的哈希值。

额外的gsub是因为在你想要的结果中你省略了这个斜杠而它不是JSON编码的一部分所以它不会被JSON.parse删除。