Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在数组中合并哈希[ruby]_Ruby_Arrays_Hash_Merge - Fatal编程技术网

在数组中合并哈希[ruby]

在数组中合并哈希[ruby],ruby,arrays,hash,merge,Ruby,Arrays,Hash,Merge,我有一个散列数组 [{: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=>49

我有一个散列数组

[{: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"}] 
比如:

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

另一种功能方法(较短)

#reduce
将所有内容分解为单个值,
#merge
将散列对象合并在一起,并可以解决与您提供的块的合并冲突

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

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

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