我收到一个基于字符串的Hash
,如下所示:
"data"=>{"uno"=>"alfa", "dos"=>"beta"}
我想重建它,以便它具有以下对象结构和命名:
beta: {uno: "alfa"}
我已经陷入了内在价值并将其转换为密钥的问题。任何帮助达到上述目标将非常感激。
更新
这里有几件事情,我后悔做了一个问题。但现在它已经在野外,我会尽力进一步解释
1.钥匙需要转换为符号
2.对"dos"=>"beta"
应倒置
3.上述对的反转键应该接管角色(来自"data"
)作为整个Hash
聚苯乙烯。由于我似乎在明确地解释我的问题时失败了,所以请随意投票。
答案 0 :(得分:2)
尝试代码:
h.reduce({}) { |hh,v| hh[ v[1][ 'dos' ].to_sym ] = { :uno => v[1][ 'uno' ] } ; hh }
# => {:beta=>{:uno=>"alfa"}}
答案 1 :(得分:0)
如果您只想将键从字符串转换为符号,请使用:
hash.inject({}){|h,(k,v)| h[k.to_sym] = v; h}
这样做会返回:{data: {uno: "alfa", dos: "beta"}}
答案 2 :(得分:0)
你可能想试试这个:
转换为Ruby哈希的简单方法是eval
字符串,但 dangerous 。所以我们可以使用更安全的方式:
>> s = '"data"=>{"uno"=>"alfa", "dos"=>"beta"}'
=> ""data"=>{"uno"=>"alfa", "dos"=>"beta"}"
>> require 'json'
=> true
>> t2 = "{#{s}}".gsub('=>', ':')
=> "{"data":{"uno":"alfa", "dos":"beta"}}"
>> h1 = JSON.parse(t2).to_hash
=> {"data"=>{"uno"=>"alfa", "dos"=>"beta"}}
>> {:data => h1["data"].inject({}){|h,(k,v)| h[k.to_sym] = v; h}}
=> {:data=>{:uno=>"alfa", :dos=>"beta"}}
如果你提供一些你期望的行为的例子会更好。