簡體   English   中英

如何在Ruby中建立雙重嵌套的哈希?

[英]How do I build a doubly-nested hash in 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

我不確定我是否理解這個問題,但這是我的解釋的答案。

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
#       }
#     }
#   } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM