我想知道是否有任何方法可以解压缩数组中的哈希值。例如
array = [{:code=>"404"}, {:code=>"302"}, {:code=>"200"}]
打开包装后应该给
array = [code: "404", code: "302", code: "200"]
我尝试过如下使用flat_map
array.flat_map { |h| h.values } & array.flat_map { |h| h.keys }
但这些是两个独立的阵列。
对于问题的更新版本,答案非常简单:
array.reduce(&:merge)
reduce是一种迭代对象并以某种方式累积值的方法。使用&:merge
是将哈希合并在一起的简写。
结果给你:
# => {:code1=>"404", :code2=>"302", :code3=>"200"}
您的预期输出[code: "404", code: "302", code: "200"]
不是声明具有三个元素的数组的有效ruby。上面的实际结果将是一个包含一个元素的数组:
[code: "404", code: "302", code: "200"]
(pry):39: warning: key :code is duplicated and overwritten on line 39
(pry):39: warning: key :code is duplicated and overwritten on line 39
#⇒ [{ :code => "200" }]
这是因为当它没有引入歧义时,可能会在哈希周围省略大括号。
你能得到的最好的是:
array.each_with_object({}) do |h, acc|
acc.merge!(h) { |_, v1, v2| [*v1, v2] }
end
#⇒ {:code=>["404", "302", "200"]}
干得好:
array = [{:code=>"404"}, {:code=>"302"}, {:code=>"200"}]
[array.last] # => [{:code=>"200"}]
现在您已经更改了问题,很明显您基本上只想将所有哈希合并到一个哈希中。你可以用这个简单的循环来做到这一点:
m = {}
array.each do |h|
m.merge!(h)
end
Ruby还提供了一种在一行中执行相同操作的奇特方法:
array.each_with_object({}) { |h, m| m.merge!(h) }
哦,是的,我差点忘了。您使用方括号编写了所需的输出,这在技术上意味着您要求的数组包含哈希。上面的代码只是给你一个简单的哈希。在Ruby中,我们使用方括号和带有大括号的散列来编写数组,但在某些情况下可以省略卷曲的数组。没有明显的理由将你的哈希抛入一个只有一个元素的数组,但如果你真的想这样做,那么你当然可以这样做,假设m
持有合并的哈希:
weird_array = [m]