Ruby 求助多个 Hash 操作问题

mobiwolf · 2012年04月20日 · 最后由 wx1452 回复于 2012年04月22日 · 3405 次阅读

hash1:

"joy_button_0"=>"Set1Button1Slots", 
"joy_button_1"=>"Set1Button2Slots", 
"joy_button_2"=>"Set1Button3Slots", 
"joy_button_3"=>"Set1Button4Slots"




hash2

"Set1Button1Slots"=>"A", 
"Set1Button2Slots"=>"B",
"Set1Button3Slots"=>"C",
"Set1Button4Slots"=>"D"




hash3

"A"=>"65",
"B"=>"66", 
"C"=>"67", 
"D"=>"68"




问题 1: 如何对这三个 hash 进行操作,直接一步得到 joy_button_0 和 65 的对应关系呢?

从而得到

"joy_button_0"=>"65", 
"joy_button_1"=>"66", 
"joy_button_2"=>"67", 
"joy_button_3"=>"68"


假设三个 hash 依次为 hash1, hash2, hash3,并且不出现任何一个 hash 中不存在某个 key 的情形:

hash1.inject({}) { |h, e| h[e.first] = hash3[hash2[e.last]]; h }

#1 楼 @ashchan hash1,hash3 的 key 是肯定都存在,hash2,有时可能只有前三项,或者前两项,也就是说 hash1,hash3 是完全古固定的,只有 hash2 是变化的,个数会变化。

#2 楼 @mobiwolf hash2 会变的话上面的代码仍适用(hash2 中缺失的值,最后得到的 hash 中相应的 hash1 的 key 会对应 nil value。

提供另一个. Hash[ hash1.map { |k, v| [k, hash3[hash2[v]]] } ]

h1, h2, h3 对应那三个 hash。

Hash.new.tap{|h| h1.each{|k, v| h[k] = h3[h2[v]] unless h3[h2[v]].nil? }}

哈哈,谢谢哈

@ashchan @wx1452 @blackanger 求助如何实现这样的 xml 文件

<joy_button_0 value="" />
<joy_button_1 value="" />
<joy_button_2 value="" />
<joy_button_3 value="" />
<joy_button_4 value="" />
<joy_button_5 value="" />
<joy_button_6 value="" />
<joy_button_7 value="" />
<joy_button_8 value="" />
<joy_button_9 value="" />
<joy_button_10 value="" />
<joy_button_11 value="" />
<joy_button_12 value="" />


我用 nokogiri 的实现:

builder = Nokogiri::XML:Builder.new.
 13.times do |f|
   str = "joy_button_"+f.to_s;
   p str
   # builder.str("value" =>"1"),这里str肯定用法不对,我的意思就是用上面的str变量的内容来作为node的key。
 end



如何用变量来生成 xml 中 node 的 k 值呢? 我看文档中都没有类似的例子。

@mobiwolf 没用过,Nokogiri,不过可以试试 send, 直接写成:

builder.send(:"joy_button_#{f}", "value" =>"1")


需要 登录 后方可回复, 如果你还没有账号请 注册新账号