【问题标题】:Convert Ruby array of hashes into one hash将 Ruby 哈希数组转换为一个哈希
【发布时间】:2013-07-02 20:58:33
【问题描述】:

我有以下数组:

array = [{"a" => 2}, {"b" => 3}, {"a" => nil}, {"c" => 2}, {"b" => nil}]

我想将其转换为 1 个大哈希,但保留所有值,因此我希望它如下所示:

{"a" => [2, nil], "b" => [3, nil], "c" => [2]}

array.inject({}) {|s, h| s.merge(h)}} 可以接近,但它会覆盖值。

【问题讨论】:

  • 在哈希中包含"c"=> [2] 不是更有意义吗?
  • 是的,也可以

标签: ruby arrays hashmap


【解决方案1】:
array = [{"a" => 2}, {"b" => 3}, {"a" => nil}, {"c" => 2}, {"b" => nil}]
a = array.each_with_object(Hash.new([])) do |h1,h|
  h1.each{|k,v| h[k] = h[k] + [v]}
end
a # => {"a"=>[2, nil], "b"=>[3, nil], "c"=>[2]}

【讨论】:

    【解决方案2】:
    array = [{"a" => 2}, {"b" => 3}, {"a" => nil}, {"c" => 2}, {"b" => nil}]
    res = {}
    
    array.each do |hash|
      hash.each do |k, v|
        res[k] ||= []
        res[k] << v
      end
    end
    

    【讨论】:

    • 如果将res = {}更改为res = Hash.new [],就可以去掉res[k] ||= []这一行
    • 感谢@naomik,但我喜欢这种方式。当您使用带有默认值的 Hash 时,会发生一些奇怪的事情
    猜你喜欢
    • 1970-01-01
    • 2014-12-10
    • 2017-07-06
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2019-10-27
    • 2019-05-23
    • 1970-01-01
    相关资源
    最近更新 更多