Сопоставление объектов из двух отдельных массивов на основе значения ключа - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть два массива. Один заполнен объектами информации о клиентах, а другой - объектами страховых возмещений.

customer = [{"Last Name":"lastname", "First Name":"firstname", "ID":"6583142"}]

claim = [{"ID"=>"6583142", "number"=>"123214", "start_date"=>"2018-10-03"}]

Цель - сопоставить каждую претензию с клиентом. Я понимаю, как узнать, существует ли идентификатор одного в другом, но как бы я связал эти два? Я не верю, что размещение совпадающих утверждений где-либо еще имеет смысл, поскольку в следующей части каждое утверждение должно быть принято или отклонено независимо от того, совпадают они или нет.

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Если вы ищете псевдобазу , например search .

Я использую множественное число для коллекций:

customers = [{"Last Name": "lastname", "First Name": "firstname", "ID": "6583142"}]
claims = [{"ID"=>"6583142", "number"=>"123214", "start_date"=>"2018-10-03"}]

Претензия имеет одного клиента, поэтому сначала найдите претензию по номеру претензии, а затем найдите ее клиента:

claim_number = "123214"
claim = claims.detect { |h| h["number"] == claim_number }
customer = customers.detect { |h| h[:"ID"] == claim["ID"] }
#=> {:"Last Name"=>"lastname", :"First Name"=>"firstname", :ID=>"6583142"}

У клиента много претензий, поэтому по его идентификатору найдите все претензии:

customer_id = "6583142"
p all_claim_by_customer = claims.select { |h| h["ID"] == customer_id }
#=> [{"ID"=>"6583142", "number"=>"123214", "start_date"=>"2018-10-03"}]

Я предлагаю использовать символы в качестве ключей для хэшей.

0 голосов
/ 07 ноября 2018
customers = [{ "Last Name":"Hardplace",  "First Name":"Rockina", "ID":"6583142" },
             { "Last Name":"Bebblebrox", "First Name":"Zaphod",  "ID":"6583143" }]

claims =    [{ "ID"=>"6583143", "number"=>"123215", "start_date"=>"2018-10-04" },
             { "ID"=>"6583142", "number"=>"123214", "start_date"=>"2018-10-03" }]

def by_id(arr)
  arr.each_with_object({}) { |g,h| h[g[:ID]] = g }
end

customers_by_id = by_id(customers)
  #=> {"6583142"=>{:"Last Name"=>"Hardplace", :"First Name"=>"Rockina", :ID=>"6583142"},
  #    "6583143"=>{:"Last Name"=>"Bebblebrox", :"First Name"=>"Zaphod", :ID=>"6583143"}}
adj_claims = claims.map { |h| h.transform_keys { |k| k == "ID" ? :ID : k } }
  #=> [{:ID=>"6583143", "number"=>"123215", "start_date"=>"2018-10-04"},
  #    {:ID=>"6583142", "number"=>"123214", "start_date"=>"2018-10-03"}]
claims_by_id = by_id(adj_claims)
  #=> {"6583143"=>{:ID=>"6583143", "number"=>"123215", "start_date"=>"2018-10-04"},
  #    "6583142"=>{:ID=>"6583142", "number"=>"123214", "start_date"=>"2018-10-03"}}

При наличии идентификатора претензии, скажем, "6583142", информация о клиенте и претензиях содержится в хешах:

customers_by_id["6583142"]
  #=> {:"Last Name"=>"Hardplace", :"First Name"=>"Rockina", :ID=>"6583142"}

и

claims_by_id["6583142"]
  #=> {:ID=>"6583142", "number"=>"123214", "start_date"=>"2018-10-03"}

При желании парные хеши, имеющие одинаковые ID, могут быть объединены, но в этом нет необходимости.

customers_by_id.keys.each_with_object({}) { |k,h|
  h[k] = customers_by_id[k].merge(claims_by_id[k]) }
  #=> {"6583142"=>{:"Last Name"=>"Hardplace", :"First Name"=>"Rockina",
  #                :ID=>"6583142", "number"=>"123214", "start_date"=>"2018-10-03"},
  #    "6583143"=>{:"Last Name"=>"Bebblebrox", :"First Name"=>"Zaphod",
  #                :ID=>"6583143", "number"=>"123215", "start_date"=>"2018-10-04"}}

Требуется вычисление adj_claims, поскольку идентификатор представлен символом в customers и строкой в ​​claims. См. Hash # transform_keys . Это символ в adj_claims.

0 голосов
/ 07 ноября 2018

Вам нужно сделать что-то вроде этого:

customer = [{"Last Name" => "lastname", "First Name" => "firstname", "ID" => "6583142"}]
claim = [{"ID"=>"6583142", "number"=>"123214", "start_date"=>"2018-10-03"}]

# Get all uniq ids
ids = (claim + customer).map {|object| object['ID']}.uniq

# Find claims and customers for every id
merged_data = ids.map do |id| 
    {
        id: id, 
        claims: claim.select{|claim| claim['ID'] == id}, 
        customers: customer.select{|customer| customer['ID'] == id}
    }
end

Результат будет:

[{
  :id=>"6583142", 
  :claims=>[{"ID"=>"6583142", "number"=>"123214", "start_date"=>"2018-10-03"}], 
  :customers=>[{"Last Name"=>"lastname", "First Name"=>"firstname", "ID"=>"6583142"}]
}]

Кроме того, если для каждого идентификатора у вас есть только одна заявка и только один клиент, вы можете просто объединить ее:

ids.map do |id|
    claim_hash = claim.select{|claim| claim['ID'] == id}.first
    customer_hash = customer.select{|customer| customer['ID'] == id}.first
    claim_hash.merge customer_hash
end
[{"ID"=>"6583142", "number"=>"123214", "start_date"=>"2018-10-03", "Last Name"=>"lastname", "First Name"=>"firstname"}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...