Хеш уникален по столбцу и объединяет другой столбец - PullRequest
0 голосов
/ 31 мая 2018

у меня ниже хеш.Как получить уникальный и объединенный хеш.

[
 {
  "email"=>"user_name@aaa.com",
  "expression"=>"aaa",
  "name"=>"bbb",
  "roles"=>[:admin]
  },

  {
   "email"=>"user_name@aaa.com",
   "expression"=>"aaa",
   "name"=>"bbb",
   "roles"=>[:manager]
  }
]

Я хочу, чтобы приведенный ниже хеш-результат уникален по электронной почте и объединен по ролям.

[
  {
    "email"=>"user_name@aaa.com",
    "expression"=>"aaa",
    "name"=>"bbb",
    "roles"=>[:admin, :manager]
  }
]

Помогите мне.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018
input.
  group_by { |e| e['email'] }.
  map do |_, v|
    v.reduce do |acc, h|
      acc.merge(h) { |_, v1, v2| v1 == v2 ? v1 : [*v1, *v2] }
    end
  end
#⇒ [{"email"=>"user_name@aaa.com",
#    "expression"=>"aaa",
#    "name"=>"bbb",
#    "roles"=>[:admin, :manager]}]
0 голосов
/ 31 мая 2018
arr = [{ "email"=>"user_name@aaa.com", "expression"=>"aaa", "name"=>"bbb",
         "roles"=>[:admin] },
       { "email"=>"user_name@aaa.com", "expression"=>"aaa", "name"=>"bbb",
         "roles"=>[:manager] }]

arr.first.merge("roles"=>arr.map { |h| h["roles"].first })
  #=> {"email"=>"user_name@aaa.com", "expression"=>"aaa", "name"=>"bbb",
  #    "roles"=>[:admin, :manager]}

Шаги следующие:

h = arr.first
  #=> {"email"=>"user_name@aaa.com", "expression"=>"aaa", "name"=>"bbb",
  #    "roles"=>[:admin]}
a = arr.map { |h| h["roles"].first }
  #=> [:admin, :manager]
g = { "roles"=>a }
  #=> {"roles"=>[:admin, :manager]}
h.merge(g)
  #=> {"email"=>"user_name@aaa.com", "expression"=>"aaa", "name"=>"bbb",
  #    "roles"=>[:admin, :manager]}

Обратите внимание, что Ruby разрешает записывать хэш в качестве аргумента метода в виде последовательности его пар ключ-значение.Например:

receiver.doit({ a: 1, b: 2})

можно записать

receiver.doit(a: 1, b: 2)
0 голосов
/ 31 мая 2018

Попробуйте это

a.group_by { |item| item["email"] }.each_with_object([]) do |(_, items), arr| 
  arr.concat([items.first.merge("roles" => items.flat_map { |item| item["roles"] }.uniq)])
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...