重建哈希,命名和替换问题

时间:2014-01-06 13:28:52

标签: ruby hashmap hashtable

我收到一个基于字符串的Hash,如下所示:

"data"=>{"uno"=>"alfa", "dos"=>"beta"}

我想重建它,以便它具有以下对象结构命名

beta: {uno: "alfa"}

我已经陷入了内在价值并将其转换为密钥的问题。任何帮助达到上述目标将非常感激。

更新
这里有几件事情,我后悔做了一个问题。但现在它已经在野外,我会尽力进一步解释 1.钥匙需要转换为符号
2.对"dos"=>"beta"应倒置 3.上述对的反转键应该接管角色(来自"data")作为整个Hash

的关键

聚苯乙烯。由于我似乎在明确地解释我的问题时失败了,所以请随意投票。

3 个答案:

答案 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"}}

如果你提供一些你期望的行为的例子会更好。