【问题标题】:Merge hashes in array [ruby]合并数组中的哈希 [ruby]
【发布时间】:2011-11-19 14:33:38
【问题描述】:

我有哈希数组

[{:id=>2, :price_psm=>450, :rooms_count=>3, :sq=>50, :tax_inc=>"t", :title=>"title1"},
 {:id=>2, :price_psm=>499, :rooms_count=>3, :sq=>40, :tax_inc=>"t", :title=>"title1"}, 
 {:id=>2, :price_psm=>499, :rooms_count=>3, :sq=>41, :tax_inc=>"t", :title=>"title1"}, 
 {:id=>1, :price_psm=>450, :rooms_count=>2, :sq=>20, :tax_inc=>"t", :title=>"title2"}] 

我如何合并相同的哈希并创建如下内容:

[{:id=>2, :price_psm=>[450,499,499], :rooms_count=>3, :sq=>[50,40,41], :tax_inc=>"t", :title=>"title1"}, 
 {:id=>1,  :price_psm=>450, :rooms_count=>2, :sq=>20, :tax_inc=>"t", :title=>"title2"}] 

【问题讨论】:

  • 究竟是什么让它们相似?
  • 从外观上看,每个散列都是相同的键,并且某些散列对于 id 键具有相同的值,因此他想通过合并具有相等 id 键的散列来展平数组.
  • @Vadim:请不要使用“相似”这个词。你的意思是一样的吗?
  • 两个问题:1)为什么price_psm有两个499? 2)为什么 sq => [20] 而不是 sq => 20 在第二个数组中?
  • 1) :price_psm 和 :sq 中的数组不应该是 uniq 2) 不需要数组,已编辑(抱歉混淆)

标签: ruby arrays hash merge


【解决方案1】:

类似:

require 'pp'

INPUT = [{:id=>2, :price_psm=>450, :rooms_count=>3, :sq=>50, :tax_inc=>"t", :title=>"title1"},
        {:id=>2, :price_psm=>499, :rooms_count=>3, :sq=>40, :tax_inc=>"t", :title=>"title1"}, 
        {:id=>2, :price_psm=>499, :rooms_count=>3, :sq=>41, :tax_inc=>"t", :title=>"title1"}, 
        {:id=>1, :price_psm=>450, :rooms_count=>2, :sq=>20, :tax_inc=>"t", :title=>"title2"}] 



RES = INPUT.group_by {|row| row[:id] }.collect do |k,v|
  keys = v.collect {|rec| rec.keys}.flatten.uniq
  group = {}
  keys.each do |key|
    vals = v.collect { |rec| rec[key] }.uniq.compact
    group[key] = vals.size > 1 ? vals : vals.first
  end
  group
end

pp RES

【讨论】:

    【解决方案2】:

    另一种功能方法(更短)

    hashes.reduce do |a, b|
      a.merge(b) { |k, v1, v2| v1 == v2 ? v1 : [v1, v2].flatten }
    end
    

    #reduce 将所有内容混合为一个值,#merge 将 Hash 对象合并在一起,并且可以解决与您提供的块的合并冲突。

    编辑 |哎呀,对不起,误读了所需的输出。这个是这样做的:

    hashes.group_by { |hash| hash[:id] }.map do |id, hashes|
      hashes.reduce do |a, b|
        a.merge(b) { |key, v1, v2| v1 == v2 ? v1 : [v1, v2].flatten }
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2015-05-07
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2015-06-13
      • 2018-07-29
      • 2020-07-24
      • 2015-05-31
      相关资源
      最近更新 更多