使用条件重新排列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”…
谢谢。这很有效。请查看编辑的请求