2017-02-15 10 views
0

EDITED: Как мы берем следующий впередПерегруппировка рубиновый хэш с условием

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 {| я | {Я [ "Name"] => i.except ("Name")}}

[{"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_object и inject. Это должно работать с любой вложенной глубиной:

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