2017-02-15 53 views
0

編輯: 我們如何採取以下前進重新排列紅寶石哈希符合條件

fields = [{"Name"=>"CONTACT.MAILADDRESS.LATITUDE", "dataName"=>"Pt_FieldDouble", "externalDataName"=>"number", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"10", "DisplayLabel"=>"Latitude", "Description"=>"Latitude", "id"=>"999505900000211"}, 
{"Name"=>"CONTACT.MAILADDRESS.LONGITUDE", "dataName"=>"Pt_FieldDouble", "externalDataName"=>"number", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"11", "DisplayLabel"=>"Longitude", "Description"=>"Longitude", "id"=>"999505900000212"}, 
{"Name"=>"CONTACT.STATE", "dataName"=>"Pt_FieldString", "externalDataName"=>"string", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"0", "DisplayLabel"=>"Status", "Description"=>"Active/Inactive", "id"=>"999505900000166"}, 
{"Name"=>"XXSTATUS", "dataName"=>"Pt_FieldString", "externalDataName"=>"string", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"0", "DisplayLabel"=>"XStatus", "Description"=>"Active/Inactive", "id"=>"99950591200166"}] 

output = 
    [{"CONTACT" => 
     { "MAILADDRESS" => 
      { "Name" => "LATITUDE", "dataName"=>"Pt_FieldDouble", "externalDataName"=>"number", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"10", "DisplayLabel"=>"Latitude", "Description"=>"Latitude", "id"=>"999505900000211"}, 
      { "Name" => "LATITUDE", "dataName"=>"Pt_FieldDouble", "externalDataName"=>"number", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"11", "DisplayLabel"=>"Longitude", "Description"=>"Longitude", "id"=>"999505900000212"}}, 
     { "Name" =>"STATE", "dataName"=>"Pt_FieldString", "externalDataName"=>"string", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"0", "DisplayLabel"=>"Status", "Description"=>"Active/Inactive", "id"=>"999505900000166"}}, 
     { "Name" =>"XXSTATUS", "dataName"=>"Pt_FieldString", "externalDataName"=>"string", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"0", "DisplayLabel"=>"XStatus", "Description"=>"Active/Inactive", "id"=>"99950591200166"}] 

我試圖

fields.map {|我| {I [ 「名稱」] => i.except( 「名稱」)}}

[{"CONTACT.MAILADDRESS.LATITUDE"=>{"dataName"=>"Pt_FieldDouble", "externalDataName"=>"number", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"10", "DisplayLabel"=>"Latitude", "Description"=>"Latitude", "id"=>"999505900000211"}}, 
{"CONTACT.MAILADDRESS.LONGITUDE"=>{"dataName"=>"Pt_FieldDouble", "externalDataName"=>"number", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"11", "DisplayLabel"=>"Longitude", "Description"=>"Longitude", "id"=>"999505900000212"}}, 
{"CONTACT.STATUS"=>{"dataName"=>"Pt_FieldString", "externalDataName"=>"string", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"0", "DisplayLabel"=>"Status", "Description"=>"Active/Inactive", "id"=>"999505900000166"}}] 

觸擊如何分割密鑰,並把這些值一起

+1

沒有必要立即接受答案。如果您稍等,可能會有更好的答案。 –

回答

1

類羅嗦,但可以做。 ..

output = {} 

pointer = nil 

fields.each do |field| 
    pointer = output 
    sections = field['Name'].split('.').each do |section| 
    pointer[section] ||= {} 
    pointer = pointer[section] 
    end 
    pointer.merge!(field) 
    pointer.delete('Name') 
end 
output 
+0

謝謝!這有一個小問題。在這種情況下,它返回,'「STATUS」=> {nil => {「dataName」=>「Pt_FieldString」,....' – user3636388

+0

嗨,是的,抱歉...我已經修復了代碼。 – SteveTurczyn

+0

謝謝。這工作。請看編輯的請求 – user3636388

2

你想要的是類似於Trie,這樣你就可以解析的名稱部分,並創建一個嵌套的哈希與each_with_objectinject。這應該適用於任何嵌套深度:

fields = [{"Name"=>"CONTACT.MAILADDRESS.LATITUDE", "dataName"=>"Pt_FieldDouble", "externalDataName"=>"number", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"10", "DisplayLabel"=>"Latitude", "Description"=>"Latitude", "id"=>"999505900000211"}, 
{"Name"=>"CONTACT.MAILADDRESS.LONGITUDE", "dataName"=>"Pt_FieldDouble", "externalDataName"=>"number", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"11", "DisplayLabel"=>"Longitude", "Description"=>"Longitude", "id"=>"999505900000212"}, 
{"Name"=>"CONTACT.STATUS", "dataName"=>"Pt_FieldString", "externalDataName"=>"string", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"0", "DisplayLabel"=>"Status", "Description"=>"Active/Inactive", "id"=>"999505900000166"}] 

tree = fields.each_with_object({}) do |field, tree| 
    field = field.dup 
    names = field.delete("Name").split('.') 
    node = names.inject(tree) do |node, name| 
    node[name] ||= {} 
    end 
    node.merge!(field) 
end 

require 'pp' 
pp tree 
# {"CONTACT"=> 
# {"MAILADDRESS"=> 
#  {"LATITUDE"=> 
#  {"dataName"=>"Pt_FieldDouble", 
#  "externalDataName"=>"number", 
#  "isRequired"=>"false", 
#  "isReadOnly"=>"false", 
#  "maxLength"=>"10", 
#  "DisplayLabel"=>"Latitude", 
#  "Description"=>"Latitude", 
#  "id"=>"999505900000211"}, 
#  "LONGITUDE"=> 
#  {"dataName"=>"Pt_FieldDouble", 
#  "externalDataName"=>"number", 
#  "isRequired"=>"false", 
#  "isReadOnly"=>"false", 
#  "maxLength"=>"11", 
#  "DisplayLabel"=>"Longitude", 
#  "Description"=>"Longitude", 
#  "id"=>"999505900000212"}}, 
# "STATUS"=> 
#  {"dataName"=>"Pt_FieldString", 
#  "externalDataName"=>"string", 
#  "isRequired"=>"false", 
#  "isReadOnly"=>"false", 
#  "maxLength"=>"0", 
#  "DisplayLabel"=>"Status", 
#  "Description"=>"Active/Inactive", 
#  "id"=>"999505900000166"}}}