Ruby 如何从多维数组创建哈希
我有这些参数:Ruby 如何从多维数组创建哈希,ruby,hash,Ruby,Hash,我有这些参数: x=["room_adults_1", "room_childs_1", "room_adults_2", "room_childs_2"] 当我运行此代码时: y = x.map { |x| x.match(/^(room)_(adults|childs)_(\d+)/)} z = y.map { |x| [x[1],[x[2],[x[3].reverse,""]]]} 我得到这个数组: => [["room", ["adults", ["1", ""]]], ["
x=["room_adults_1", "room_childs_1", "room_adults_2", "room_childs_2"]
当我运行此代码时:
y = x.map { |x| x.match(/^(room)_(adults|childs)_(\d+)/)}
z = y.map { |x| [x[1],[x[2],[x[3].reverse,""]]]}
我得到这个数组:
=> [["room", ["adults", ["1", ""]]], ["room", ["childs", ["1", ""]]], ["room", ["adults", ["2", ""]]], ["room", ["childs", ["2", ""]]]]
我想把最后的结果转换成散列。如果我使用z.to_h
(折叠最后一个元素),我将获得{“room”=>[“childs”,[“2”,“]}
。但我想要一个像这样的杂烩:
{
"room":{
"adults":{[
{"1": ""},
{"2": ""}
]},
"child":{[
{"1": ""},
{"2": ""}
]}
}
}
我该怎么办?在这种情况下,我更喜欢
每个带有对象的\u
:
x.map { |e| e.split '_' }
.group_by(&:shift) # room
.map { |k, v| [k, v.group_by(&:shift) # adults/children
.map { |k, v| [k, v.map { |e, *| {e => ""} } ] }
.to_h ] }
.to_h
#⇒ {"room"=>{"adults"=>[{"1"=>""}, {"2"=>""}],
# "childs"=>[{"1"=>""}, {"2"=>""}]}}
x = ["room_adults_1", "room_childs_1", "room_adults_2", "room_childs_2"]
export = x.each_with_object(Hash.new { |k, v| k[v] = Hash.new { |k, v| k[v] = [] } }) do |string, exp|
room, type, id = string.split("_")
exp[room][type] << {id => ""}
end
p export
# => {"room"=>{"adults"=>[{"1"=>""}, {"2"=>""}], "childs"=>[{"1"=>""}, {"2"=>""}]}}
x=[“成人房1”、“儿童房1”、“成人房2”、“儿童房2”]
export=x.each|u with|u object(Hash.new{k,v{k[v]=Hash.new{k,v{k[v]=[]})do|string,exp|
房间,类型,id=string.split(“”)
exp[room][type]“”
结束
p出口
#=>{“房间”=>{“成人”=>[{“1”=>”}、{“2”=>”}、“儿童”=>[{“1”=>”}、{“2”=>“}]}
我假设期望的结果是
{:room=>{:adults=>[{:"1"=>""}, {:"2"=>""}], :childs=>[{:"1"=>""}, {:"2"=>""}]}}
因为问题中给出的构造不是有效的Ruby对象,更不用说散列了
arr = ["room_adults_1", "room_childs_1", "room_adults_2", "room_childs_2"]
h = arr.map { |s| s.split('_')[1,2].map(&:to_sym) }.group_by(&:first)
#=> {:adults=>[[:adults, :"1"], [:adults, :"2"]],
# :childs=>[[:childs, :"1"], [:childs, :"2"]]}
{ room: h.merge(h) { |k,a,_| a.map { |_,b| { b=>"" } } } }
#=> {:room=>{:adults=>[{:"1"=>""}, {:"2"=>""}], :childs=>[{:"1"=>""}, {:"2"=>""}]}}
如果键是字符串而不是符号,请删除
.map(&:to_sym)
虽然不需要dup
,但回答非常好,因为map
无论如何都会返回一份副本。另外,我会在前面几行的末尾加上点,这是实际的代码。你是个天才:d来自Params的“x”变量。要将正确的值分配给散列,请使用:params[“room#{k}{f.first}”]@engineersmnky点允许位于下一行dup
在这里是多余的,是的,谢谢,删除了。@engineersmnky,我不明白你提到的点的位置。Muddie现在看起来不错,但IRB会被它扼杀。@lcguida。。。stackoverflow e l'inglese:p您想要的哈希不是哈希。它不是有效的Ruby对象。对于“儿童/成人”:{[…]}?{[{“1”:”“},{“2”:”“}]}
是{arr}
其中arr=[{“1”:”“},{“2”:”“}]
,但{arr}
不是有效的对象。