Это можно сделать довольно чисто, используя несколько встроенных методов Ruby.
a1 = [{ ID: 12496, name: "Robert", email: "[email protected]" },
{ ID: 12497, name: "Lola", email: "[email protected]" },
{ ID: 12498, name: "Hank", email: "[email protected]" }]
a2 = [{ ID: 12497, name: "Lola", ORDER_NO: 5511427 },
{ ID: 12496, name: "Robert", ORDER_NO: 5511426 }]
index = a2.group_by{|entry| [entry[:ID], entry[:name]] }
a1.map{|entry| (index[[entry[:ID], entry[:name]]] || []).reduce(entry, :merge) }
Результат:
[{:ID=>12496, :name=>"Robert", :email=>"[email protected]", :ORDER_NO=>5511426},
{:ID=>12497, :name=>"Lola", :email=>"[email protected]", :ORDER_NO=>5511427},
{:ID=>12498, :name=>"Hank", :email=>"[email protected]"}]
Разбивка:
Во-первых, мы используем group_by
построить таблицу записей в а2, которые потенциально могут быть объединены в записи в a1.Мы индексировать эту таблицу на идентификатор и имя ключей, так как те факторы, мы используем, чтобы определить, какие записи матча:
index = a2.group_by{|entry| [entry[:ID], entry[:name]] }
Это дает результат:
{[12497, "Lola"]=>[{:ID=>12497, :name=>"Lola", :ORDER_NO=>5511427}],
[12496, "Robert"]=>[{:ID=>12496, :name=>"Robert", :ORDER_NO=>5511426}]}
Далее мы map
каждый запись в a1
к своей новой форме, с порядковыми номерами в индексе объединена:
a1.map{|entry|
# ...
}
чтобы получить значение мы отображающие каждую запись в, мы начнем с getti нг массив, содержащий все значения в a2
, которые пригодны для слияния с этой записью из a1
:
(index[[entry[:ID], entry[:name]]] || [])
Это будет возвращать что-то вроде [{:ID=>12497, :name=>"Lola", :ORDER_NO=>5511427}]
для Лолы и пустой массив для Хэнк, который не имеет соответствующей записи в a2
,
Затем, начиная со входа от a1
, мы reduce
все записи из индекса к одной хэш с помощью merge
(например reduce(entry, :merge)
), что приводит к записи, как {:ID=>12496, :name=>"Robert", :email=>"[email protected]", :ORDER_NO=>5511426}
.
Все это может показаться немного сложным, если вы не знакомы с методами в основной библиотеке Ruby. Но как только вы понимаете простые функциональные программные понятия, такие как map и reduce, действительно не так сложно придумать простые и мощные решения, подобные этому.
Что произойдет, если 'a2' содержит записи, отсутствующие в' a1'? В настоящее время они будут отсутствовать в результате, но это может быть неуместно, если обе хеши гарантированно содержат точно все одинаковые комбинации id/name. –
@PatrickOscity Я хотел бы игнорировать записи, не присутствующие в a1. – etdev