使用条件重新排列ruby哈希

使用条件重新排列ruby哈希,ruby,hash,Ruby,Hash,编辑: 我们如何推进以下方面 fields = [{"Name"=>"CONTACT.MAILADDRESS.LATITUDE", "dataName"=>"Pt_FieldDouble", "externalDataName"=>"number", "isRequired"=>"false", "isReadOnly"=>"false", "maxLength"=>"10", "DisplayLabel"=>"Latitude", "Descripti

编辑: 我们如何推进以下方面

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[“Name”]=>i.except(“Name”)}


如何分割键并将值放在一起有点冗长,但您可以

 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

有点罗嗦,但你可以

 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

您想要的类似于,因此您可以解析名称部分,并使用and创建嵌套哈希。这应适用于任何嵌套深度:

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

您想要的类似于,因此您可以解析名称部分,并使用and创建嵌套哈希。这应适用于任何嵌套深度:

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

没有必要马上接受答案。如果你稍等一下,可能会有更好的答案。没有必要马上接受答案。如果您稍等,可能会有更好的答案。谢谢!这有点小问题。在本例中,它返回,
“STATUS”=>{nil=>{“dataName”=>“Pt_FieldString”…
谢谢。这很有效。请查看编辑的请求谢谢!这有一点问题。在本例中,它返回,
“STATUS”=>{nil=>{“dataName”=>“Pt_FieldString”…
谢谢。这很有效。请查看编辑的请求