【问题标题】:Merge multiple Ruby hash attributes合并多个 Ruby 哈希属性
【发布时间】:2014-04-04 02:01:46
【问题描述】:

我有几个对象,每个对象都有一个ids 属性,它是 id 的哈希值。例如,person_1.ids{id1: "1", id2: "2"}person_2.ids{id1: "3", id2: "4"}person_3.ids{id1: "5", id2: "6"}。我可以从这些对象的集合(或数组)(比如persons)到{ id1: "1,3,5", id2: "2,4,6" } 形式的单个哈希的最干净的方法是什么。

【问题讨论】:

  • 为什么不在你的问题中写persons 而不是说他们每个人都是person_1.ids 等等?

标签: ruby hash


【解决方案1】:

我愿意:

person_1_ids = {id1: "1", id2: "2"}
person_2_ids = {id1: "3", id2: "4"}
person_3_ids = {id1: "5", id2: "6"}

hash = [person_1_ids,person_2_ids,person_3_ids].inject({}) do |out_hash,in_hash|
  out_hash.merge(in_hash) { |k,o,n| [o,n].join(',') }
end

hash # => {:id1=>"1,3,5", :id2=>"2,4,6"}

【讨论】:

  • 如果您在我的评论之后更改了它,那么抱歉,最好将 {} 作为您最初所做的 inject 的初始值。没有它,它会起作用,但它会对给定的哈希产生副作用。
【解决方案2】:
person_1_ids = {id1: "1", id2: "2"}
person_2_ids = {id1: "3", id2: "4"}
person_3_ids = {id1: "5", id2: "6"}

(person_1_ids.to_a + person_2_ids.to_a + person_3_ids.to_a).group_by{|a| a.first}.each_with_object({}){|h, obj| obj[h.first] = h.last.transpose.last.join(",")}

【讨论】:

    【解决方案3】:

    这是一个更简单(易于理解)的版本:

    person_1_ids = {id1: "1", id2: "2"}
    person_2_ids = {id1: "3", id2: "4"}
    person_3_ids = {id1: "5", id2: "6"}
    
    hash = Hash.new{|h,k| h[k] = []}
    
    [person_1_ids,person_2_ids,person_3_ids].each do |h| 
      h.keys.each do |k|
        hash[k] << h[k]
      end
    end
    
    persons = {}
    
    hash.keys.each do |k|
      persons[k] = hash[k].join(",")
    end
    
    puts persons #{:id1=>"1,3,5", :id2=>"2,4,6"}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2013-10-18
      • 2012-01-14
      • 2019-02-21
      • 2019-08-08
      • 1970-01-01
      相关资源
      最近更新 更多