2017-04-16 63 views
0

我正在研究一種語言翻譯系統,需要翻譯翻譯字段的「地圖」。首先,我需要用一組默認值構建數據結構。如何在Ruby中構建雙重嵌套的散列?

比方說,我有這些變量:

fields = [:title, :description] 
languages = [:en, :fr] 

我試圖找到最簡單的方法來創建一個哈希看起來像這樣:

{ 
    :detection => { 
    :title => { 
     :en => :en, 
     :fr => :fr 
    }, 
    :description => { 
     :en => :en, 
     :fr => :fr 
    } 
    }, 
    # ... other fields 
} 

我知道我能做到通過迭代fields變量,並在其中通過使用Ruby的zip方法構建內部哈希值。然而,我不知道的是,是否有辦法將這兩個領域的外部和內部價值「雙重壓縮」。像{ :detection => fields.zip(languages.zip(languages)) }(我知道這不是正確的方式來使用zip,但這是我想到的想法)。

同樣,我可以通過fields循環來做到這一點,但我很好奇,如果我可以做到這一點不同?

謝謝!


下面是它目前(與循環)來實現:

def build_default_detection_data 
    fields = [:title, :description] 
    languages = [:en, :fr] 

    default = { 
    detection_map: {}, 
    } 

    fields.each do |field| 
    default[:detection_map][field] = Hash[languages.zip(languages)] 
    end 

    default 
end 

回答

0

我不知道我理解的問題,但這裏的一個答案,我的解釋。

keys  = [:detection, :abstraction] 
fields = [:title, :description] 
languages = [:en, :fr] 

keys.each_with_object({}) do |key, g| 
    g.update(
    key => fields.each_with_object({}) do |f, h| 
     h[f] = languages.each_with_object({}) { |sym, h| h[sym] = sym } 
    end 
) 
end 

#=> { 
#  :detection => { 
#  :title => { 
#   :en => :en, 
#   :fr => :fr 
#  }, 
#  :description => { 
#   :en => :en, 
#   :fr => :fr 
#  } 
#  }, 
#  :abstraction => { 
#  :title => { 
#   :en => :en, 
#   :fr => :fr 
#  }, 
#  :description => { 
#   :en => :en, 
#   :fr => :fr 
#  } 
#  } 
# } 
+0

謝謝,@Alex。好多了。 –