合并两个哈希数组

and*_*ape 0 ruby

寻找一种以特殊方式合并两个哈希数组的优雅方法:

new_data = [{"name" => "a"}, {"name" => "b"}, {"name" => "c"}]
old_data = [{"name" => "a", "data" => "extra1"}, {"name" => "d", "data2" => "extra"}]
result = [{"name" => "a", "data" => "extra1"}, {"name" => "b"}, {"name" => "c"}]
Run Code Online (Sandbox Code Playgroud)

结果必须具有所有名称哈希值,new_data只有old_data名称键匹配的额外数据.

我的第一次尝试是这个,但它创建了一个额外的哈希:

def combine(new_data, old_data)
  int = []
  new_data.each do |s|
    old_data.each do |e|
      (int << (s.merge e)) if e["name"] == s["name"]
    end
    int << s
  end
  int
end

# => [{"name"=>"a", "data"=>"extra1"}, {"name"=>"a"}, {"name"=>"b"}, {"name"=>"c"}]
Run Code Online (Sandbox Code Playgroud)

zwi*_*pie 5

一个单行,但在大型集合上可能不太高效.

new_data.map{ |e| e.merge(old_data.detect{ |e2| e2['name'] == e['name'] } || {}) }
Run Code Online (Sandbox Code Playgroud)