Ruby 如何基于相同的哈希键值合并两个哈希数组?

Ruby 如何基于相同的哈希键值合并两个哈希数组?,ruby,Ruby,我有两个哈希数组: a = [{"b"=>123,"c"=>456}, {"b"=>456,"c"=>555}] b = [{"c"=>456,"d"=>789}, {"b"=>222,"c"=>444}] 如果键c的值在a和b中都相等,我如何将它们连接起来?这意味着我希望能够与a['c']==b['c'] 这是我想要得到的结果: final_array = [{"b"=>123,"c"=>456,"d"=>789}, {"b

我有两个哈希数组:

a = [{"b"=>123,"c"=>456}, {"b"=>456,"c"=>555}]
b = [{"c"=>456,"d"=>789},  {"b"=>222,"c"=>444}]
如果键
c
的值在
a
b
中都相等,我如何将它们连接起来?这意味着我希望能够与
a['c']==b['c']

这是我想要得到的结果:

final_array = [{"b"=>123,"c"=>456,"d"=>789}, {"b"=>456,"c"=>555}, {"b"=>222,"c"=>444}]
这是实现这一目标的最佳方法:

a = [{"b"=>123,"c"=>456}, {"b"=>456,"c"=>555}]    
b = [{"c"=>456,"d"=>789}, {"b"=>222,"c"=>444}]
p a.zip(b).flat_map{|k,v| next k.update(v) if k["c"] == v["c"];[k,v]}
# >> [{"b"=>123, "c"=>456, "d"=>789}, {"b"=>456, "c"=>555}, {"b"=>222, "c"=>444}]
这是实现这一目标的最佳方法:

a = [{"b"=>123,"c"=>456}, {"b"=>456,"c"=>555}]    
b = [{"c"=>456,"d"=>789}, {"b"=>222,"c"=>444}]
p a.zip(b).flat_map{|k,v| next k.update(v) if k["c"] == v["c"];[k,v]}
# >> [{"b"=>123, "c"=>456, "d"=>789}, {"b"=>456, "c"=>555}, {"b"=>222, "c"=>444}]
a=[{“b”=>123,“c”=>456},{“b”=>456,“c”=>555}]
b=[{“c”=>456,“d”=>789},{“b”=>222,“c”=>444}]
def merge_hashes_与_equal_值(_hashes数组,键)
数组_of_hashes.sort{| a,b | a[key]b[key]}。
块{h | h[key]}。
每个带有{u对象([]){h,result{result[{“b”=>222,“c”=>444},{“c”=>456,“d”=>789,“b”=>123},{“b”=>456,“c”=>555}]
首先连接数组,并将其传递给具有要合并的哈希键的方法。对该数组进行排序,然后将要合并的哈希放在另一个数组中,这使得合并更易于编程。在这里,我选择了#chunk来处理检测具有相同键的哈希连续运行的操作,以及#每个#都具有#对象to编译最终数组

由于此方法需要处理一个数组,因此起始数组的长度不必相等,而且这些数组的顺序也无关紧要。缺点是要操作的键必须包含可排序的值(例如,不能为零)

下面是解决此问题的另一种方法,该方法使用散列来构建结果:

def merge_hashes_with_equal_values(array_of_hashes, key)
  result = Hash.new { |h,k| h[k] = {} }
  remainder = []
  array_of_hashes.each_with_object(result) do |h, answer|
    if h.has_key?(key)
      answer[h.fetch(key)].merge!(h)
    else
      remainder << h
    end
  end.values + remainder
end
def merge_hashes_与_equal_值(_hashes的数组,键)
结果=Hash.new{| h,k | h[k]={}
余数=[]
散列数组。每个包含对象(结果)do | h的数组,回答|
如果h.有_键?(键)
回答[h.fetch(key)]。合并!(h)
其他的
余数
a=[{“b”=>123,“c”=>456},{“b”=>456,“c”=>555}]
b=[{“c”=>456,“d”=>789},{“b”=>222,“c”=>444}]
def merge_hashes_与_equal_值(_hashes数组,键)
数组_of_hashes.sort{| a,b | a[key]b[key]}。
块{h | h[key]}。
每个带有{u对象([]){h,result{result[{“b”=>222,“c”=>444},{“c”=>456,“d”=>789,“b”=>123},{“b”=>456,“c”=>555}]
首先连接数组,并将其传递给具有要合并的哈希键的方法。对该数组进行排序,然后将要合并的哈希放在另一个数组中,这使得合并更易于编程。在这里,我选择了#chunk来处理检测具有相同键的哈希连续运行的操作,以及#每个#都具有#对象to编译最终数组

由于此方法需要处理一个数组,因此起始数组的长度不必相等,而且这些数组的顺序也无关紧要。缺点是要操作的键必须包含可排序的值(例如,不能为零)

下面是解决此问题的另一种方法,该方法使用散列来构建结果:

def merge_hashes_with_equal_values(array_of_hashes, key)
  result = Hash.new { |h,k| h[k] = {} }
  remainder = []
  array_of_hashes.each_with_object(result) do |h, answer|
    if h.has_key?(key)
      answer[h.fetch(key)].merge!(h)
    else
      remainder << h
    end
  end.values + remainder
end
def merge_hashes_与_equal_值(_hashes的数组,键)
结果=Hash.new{| h,k | h[k]={}
余数=[]
散列数组。每个包含对象(结果)do | h的数组,回答|
如果h.有_键?(键)
回答[h.fetch(key)]。合并!(h)
其他的

k.update做什么?这是如何专门合并那些
c
相同但不
b
d
的内容的?这不会产生与原始海报要求的结果类似的结果。@Edmund由于网络中断,我无法编辑此帖子。现在我完成了。k.update做什么?t如何他只特别合并了
c
相同但不是
b
d
的那些帖子?这不会产生与原始海报要求的结果类似的结果。@Edmund由于网络中断,我无法编辑这篇帖子。现在我完成了。有人能回答这个问题吗