将ruby哈希转换为另一个集合

将ruby哈希转换为另一个集合,ruby,Ruby,然后应产生以下结果: atts = { key1: "value1", key2: "value2" } 因此,我想创建一个函数,将ATT转换为自定义ATT custom_atts = { "key1" => { string_value: "value1", data_type: "String" }, "key2" => { string_value: "value2", data_type: "Strin

然后应产生以下结果:

atts = {
    key1: "value1",
    key2: "value2"
}
因此,我想创建一个函数,将ATT转换为自定义ATT

custom_atts = {
    "key1" => {
    string_value: "value1",
    data_type: "String"
    },
    "key2" => {
    string_value: "value2",
    data_type: "String"
    }
}
我可以循环使用如下哈希值:

def custom_atts(atts)

end
但不确定如何在循环中创建包含哈希的哈希。

尝试以下方法:

h.each do |key, value|
  puts key
  value.each do |k,v|
    puts k
    puts v
  end
end

如果您的新键应该是字符串而不是符号,那么将
key
更改为
key。在地图内部更改为

您使用
map
在Ruby中执行这些操作可能有人被否决,因为
atts
的键是符号,但期望的结果是将这些键转换为字符串。。。。这就是最后可选的
to_s
的目的;而且,我相信,它是符号还是字符串并不是问这个问题的主要原因喜欢Ruby的表现力,能够做出如此简短的解决方案。是的,没什么大不了的,有一个0票的被接受的答案真是太好了
atts = {
    key1: "value1",
    key2: "value2"
}

def custom_atts(atts)

  Hash[ atts.keys.map { |key|
          [ key, {
              string_value: atts[key],
              data_type: "String" } ] } ]

end

puts custom_atts(atts).inspect

# {:key1=>
#  {:string_value=>"value1", 
#   :data_type=>"String"}, 
#  :key2=>{
#    :string_value=>"value2", 
#    :data_type=>"String"}}
atts.each_with_object({}) { |(k,v),h| h[k.to_s] = { string_value: v, data_type: v.class } }
  #=> {"key1"=>{:string_value=>"value1", :data_type=>String},
  #    "key2"=>{:string_value=>"value2", :data_type=>String}}