Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何从多维数组创建哈希_Ruby_Hash - Fatal编程技术网

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}
不是有效的对象。