在红宝石中打开哈希包

问题描述 投票:-5回答:4

我想知道是否有任何方法可以解压缩数组中的哈希值。例如

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 }

但这些是两个独立的阵列。

ruby
4个回答
2
投票

对于问题的更新版本,答案非常简单:

array.reduce(&:merge)

reduce是一种迭代对象并以某种方式累积值的方法。使用&:merge是将哈希合并在一起的简写。

结果给你:

# => {:code1=>"404", :code2=>"302", :code3=>"200"}

1
投票

您的预期输出[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"]}

0
投票

干得好:

array = [{:code=>"404"}, {:code=>"302"}, {:code=>"200"}]
[array.last] # => [{:code=>"200"}]

0
投票

现在您已经更改了问题,很明显您基本上只想将所有哈希合并到一个哈希中。你可以用这个简单的循环来做到这一点:

m = {}
array.each do |h|
  m.merge!(h)
end

Ruby还提供了一种在一行中执行相同操作的奇特方法:

array.each_with_object({}) { |h, m| m.merge!(h) }

哦,是的,我差点忘了。您使用方括号编写了所需的输出,这在技术上意味着您要求的数组包含哈希。上面的代码只是给你一个简单的哈希。在Ruby中,我们使用方括号和带有大括号的散列来编写数组,但在某些情况下可以省略卷曲的数组。没有明显的理由将你的哈希抛入一个只有一个元素的数组,但如果你真的想这样做,那么你当然可以这样做,假设m持有合并的哈希:

weird_array = [m]
© www.soinside.com 2019 - 2024. All rights reserved.