以下递归方法应提供所需的结果。
def combine_em(arr)
(k1, k2), (v1, v2) = arr.map(&:flatten).transpose
(k1==k2 && v1.is_a?(Hash)) ? { k1=>combine_em([v1, v2]) } :
{}.merge(*arr)
end
arr = [{"base"=>{"floor1"=>{"apt1"=>{"room"=>4}}}},
{"base"=>{"floor1"=>{"apt2"=>{"room"=>6}}}}]
combine_em arr
#=> {"base"=>{"floor1"=>{"apt1"=>{"room"=>4},
# "apt2"=>{"room"=>6}}}}
arr = [{"base"=>{"floor1"=>{"level1"=>{"apt1"=>{"room"=>4}}}}},
{"base"=>{"floor1"=>{"level1"=>{"apt2"=>{"room"=>6}}}}}]
combine_em arr
#=> {"base"=>{"floor1"=>{"level1"=>{"apt1"=>{"room"=>4},
# "apt2"=>{"room"=>6}}}}}
arr = [{"base"=>{"floor1"=>{"apt1"=>{"room"=>4}}}},
{"base"=>{"floor2"=>{"apt1"=>{"room"=>6}}}}]
combine_em arr
#=> {"base"=>{"floor1"=>{"apt1"=>{"room"=>4}},
# "floor2"=>{"apt1"=>{"room"=>6}}}}
arr = [{"base"=>{"floor1"=>{"apt1"=>{"room1"=>4}}}},
{"base"=>{"floor1"=>{"apt1"=>{"room2"=>6}}}}]
combine_em arr
#=> {"base"=>{"floor1"=>{"apt1"=>{"room1"=>4,
# "room2"=>6}}}}
arr = [{"base1"=>{"floor1"=>{"apt1"=>{"room"=>4}}}},
{"base2"=>{"floor2"=>{"apt1"=>{"room"=>6}}}}]
combine_em arr
#=> {"base1"=>{"floor1"=>{"apt1"=>{"room"=>4}}},
# "base2"=>{"floor2"=>{"apt1"=>{"room"=>6}}}}
arr = [{"base"=>{"floor1"=>{"apt1"=>{"room"=>4}}}},
{"base"=>{"floor1"=>{"apt1"=>{"room"=>6}}}}]
combine_em arr
#=> {"base"=>{"floor1"=>{"apt1"=>{"room"=>6}}}}
arr 的最后一个示例(如果可能发生)可能不会给出预期的结果。如果是这样,则有必要在这种情况下指定所需的返回值。
Hash#merge 在 Ruby v2.6 中被更改为允许多个参数,这就是我们现在可以编写的原因
arr = [{:a=>1}, {:b=>2}, {:c=>3}]
{}.merge(*arr)
#=> {:a=>1, :b=>2, :c=>3}
要支持早期版本的 Ruby,请编写
arr.reduce(&:merge)
这是的简写
arr.reduce { |h,g| h.merge(g) }
见Enumerable#reduce(又名inject)。
要全面了解递归的工作原理,可能需要使用 puts 语句对方法进行加盐。