【问题标题】:Group by and format array of hash values in ruby在 ruby​​ 中分组和格式化哈希值数组
【发布时间】:2012-06-23 00:24:27
【问题描述】:

嘿,我有一个哈希值数组,如下所示。

[{"group" => "1", "message" => "hey", "weight" => 1}, {"group" => "1", "message" 
 => "hey1", "weight" => 2}, {"group" => "2", "message" => "hey3", "weight" => 4}]

我想按组分组并对其进行格式化,以便获得以下信息:

[{"group" => 1, "messages" => {"hey","hey1"}, "weights" => {1,2}}, {"group" => 2,
  "messages" => {"hey3"}, "weights" => {4}}]

有没有很好的 ruby​​ 方法来实现这一点?

编辑:现在我有了:

[
  {"group" => "1", "message" => {"hey" => "1"}},
  {"group" => "1", "message" => {"hey1" => "2"}}
]

我想要

{"group" => "1", "messages" => {"hey1" => "1", "hey2" => "2"} }

【问题讨论】:

  • 你的意思是[{"group" => 1, "messages" => ["hey","hey1"], "weights" => [1,2]}
  • 你的意思是消息和权重的数组,对吧,假设它们的顺序相同?就个人而言,我只是关闭组,并将消息和权重作为一个完整的对象保留,以避免任何混淆。
  • 是的,我将 msg 和 weight 作为自己的对象,所以现在我有以下 [{"group" => "1", "message" => {"hey" => "1"}}, {"group" => "1", "message" => {"hey1" => "2"}}] 我想要 [{"group" => "1", "messages" => {"hey1" => "1", "hey2" => 2"}]
  • 您的需求未明确。 [{a:1},{a:2}][{a:1},{b:2}][{a:{b:3}},{a:{b:3}}][{a:{b:3}},{a:{b:4}}] 你想要什么?

标签: ruby arrays grouping


【解决方案1】:

根据您修改后的问题:

groups = [
  {"group" => "1", "message" => {"hey" => "1"}},
  {"group" => "1", "message" => {"hey1" => "2"}}
]

merged = groups.inject do |h1,h2|
  h1.merge(h2) do |k,v1,v2|
    if v1==v2
      v1
    elsif v1.is_a?(Hash) && v2.is_a?(Hash)
      v1.merge(v2)
    else
      [*v1,*v2]
    end
  end
end

p merged
#=> {"group"=>"1", "message"=>{"hey"=>"1", "hey1"=>"2"}}

【讨论】:

    【解决方案2】:

    我认为你想要的输出是:

    [{"messages"=>["hey", "hey1"], "weights"=>[1, 2], "group"=>"1"}, {"messages"=>["hey3"], "weights"=>[4], "group"=>"2"}]
    

    如果是这种情况,这段代码会做你想做的事:

    h.group_by { |item| item["group"] }.values.map do |item|
        item.inject({"messages" => [], "weights" => []}) do |result, subitem|
            result["group"] = subitem["group"]
            result["messages"] << subitem["message"]
            result["weights"] << subitem["weight"]
            result
        end
    end
    

    您应该能够更好地了解您的具体问题,但这应该是一个很好的起点。

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2013-02-13
      • 2015-11-18
      • 1970-01-01
      • 2010-12-11
      相关资源
      最近更新 更多