Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Join_Hash_Merge - Fatal编程技术网

Ruby 在散列一行中连接公共密钥

Ruby 在散列一行中连接公共密钥,ruby,arrays,join,hash,merge,Ruby,Arrays,Join,Hash,Merge,我有这样一组配对: [{"a"=>"1"}, {"b"=>"2"}, {"a"=>"3"}, {"b"=>"4"}, {"a"=>"5"}] 我想要一种方法来合并具有多个值的公共键,以便: [{"a"=>["1","3","5"]}, {"b"=>["2","4"]}] array=[{“a”=>“1”}、{“b”=>“2”}、{“a”=>“3”}、{“b”=>“4”}、{“a”=>“5”}] {}.tap{| r | array.each{| h

我有这样一组配对:

[{"a"=>"1"}, {"b"=>"2"}, {"a"=>"3"}, {"b"=>"4"}, {"a"=>"5"}]
我想要一种方法来合并具有多个值的公共键,以便:

[{"a"=>["1","3","5"]}, {"b"=>["2","4"]}]
array=[{“a”=>“1”}、{“b”=>“2”}、{“a”=>“3”}、{“b”=>“4”}、{“a”=>“5”}]

{}.tap{| r | array.each{| h | h.each{| k,v |(r[k]| |=[])还没有尝试过,但类似的方法也应该有效

   a.each_with_object( Hash.new{ |h,k| h[k] = [] } ) do |x, hash|
      hash[x.keys.first] << x.values.first
   end
a.each_with_object(Hash.new{h,k{h[k]=[])do|x,Hash|

hash[x.keys.first]根据Marc Andre的建议进行了改进

array = [{"a"=>"1"}, {"b"=>"2"}, {"a"=>"3"}, {"b"=>"4"}, {"a"=>"5"}]
array.group_by(&:keys).map{|k, v| {k.first => v.flat_map(&:values)}}


您的问题的解决方案:

array.map(&:first).group_by(&:first).map{|k, v| {k => v.map(&:last)}}
我很好奇,为什么开始和结束时哈希只包含一个密钥对。数组更合适。例如:

other = [["a", "1"], ["b", "2"], ["a", "3"], ["b", "4"], ["a", "5"]]
r = other.group_by(&:first).map{|k, v| [k => v.map(&:last)]}
r  # => [["a", ["1", "3", "5"]], ["b", ["2", "4"]]]
Hash[r] # => {"a"=>["1", "3", "5"], "b"=>["2", "4"]}

我不确定你是否会因为简洁而获奖,但我喜欢这种方式。带块的合并函数非常适合这种情况:

new = {}
array.each {|p| new.merge!(p) {|k,l,r| [l,r].flatten }}

首先,这不是一个1行程序。其次,它不会产生所需的输出。使用
Hash#First
将哈希转换为数组很酷。
array.map(&:first).group_by(&:first).map{|k, v| {k => v.map(&:last)}}
other = [["a", "1"], ["b", "2"], ["a", "3"], ["b", "4"], ["a", "5"]]
r = other.group_by(&:first).map{|k, v| [k => v.map(&:last)]}
r  # => [["a", ["1", "3", "5"]], ["b", ["2", "4"]]]
Hash[r] # => {"a"=>["1", "3", "5"], "b"=>["2", "4"]}
new = {}
array.each {|p| new.merge!(p) {|k,l,r| [l,r].flatten }}