Как объединить массив хешей, основанный на значении хеша, но не объединять значения вместо переопределения - PullRequest
1 голос
/ 24 мая 2019

У меня есть массив хэшей, подобный этому:

[
  { name: 'Pratha', email: 'c@f.com' },
  { name: 'John', email: 'j@g.com' },
  { name: 'Clark', email: 'x@z.com' },
]

И это массив хэшей второй группы:

[
  { name: 'AnotherNameSameEmail', email: 'c@f.com' },
  { name: 'JohnAnotherName', email: 'j@g.com' },
  { name: 'Mark', email: 'd@o.com' },
]

То, что я хочу, это объединить эти два массива в один, объединить на основе :email и сохранить последний (или первый) :name.

Ожидаемый результат (последнее имя переопределено):

[
  { name: 'AnotherNameSameEmail', email: 'c@f.com' },
  { name: 'JohnAnotherName', email: 'j@g.com' },
  { name: 'Mark', email: 'd@o.com' },
  { name: 'Clark', email: 'x@z.com' },
]

или (имя сохранено)

[
  { name: 'Pratha', email: 'c@f.com' },
  { name: 'John', email: 'j@g.com' },
  { name: 'Mark', email: 'd@o.com' },
  { name: 'Clark', email: 'x@z.com' },
]

Так что, в основном, я хочу сгруппировать по :email, сохранить one :name, отбросить двойные электронные письма.

Примеры, найденные в SO, создают массив значений для :name.

Ruby 2.6.3

Ответы [ 2 ]

3 голосов
/ 24 мая 2019

Может быть, вы могли бы просто позвонить Array # uniq с помощью блока на ключе электронной почты объединения ( Array # + ) из двух массивов:

(ary1 + ary2).uniq { |h| h[:email] }
2 голосов
/ 24 мая 2019
a1 = [
  { name: 'Pratha', email: 'c@f.com' },
  { name: 'John', email: 'j@g.com' },
  { name: 'Clark', email: 'x@z.com' },
]

a2 = [
  { name: 'AnotherNameSameEmail', email: 'c@f.com' },
  { name: 'JohnAnotherName', email: 'j@g.com' },
  { name: 'Mark', email: 'd@o.com' },
]

Давайте сначала сохраним последнее:

(a1+a2).each_with_object({}) { |g,h| h.update(g[:email]=>g) }.values
  #=> [{:name=>"AnotherNameSameEmail", :email=>"c@f.com"},
  #    {:name=>"JohnAnotherName", :email=>"j@g.com"},
  #    {:name=>"Clark", :email=>"x@z.com"},
  #    {:name=>"Mark", :email=>"d@o.com"}]

Чтобы сохранить первое, сделайте то же самое с (a1+a2), замененным на (a2+a1), чтобы получить:

  #=> [{:name=>"Pratha", :email=>"c@f.com"},
  #    {:name=>"John", :email=>"j@g.com"},
  #    {:name=>"Mark", :email=>"d@o.com"},
  #    {:name=>"Clark", :email=>"x@z.com"}]  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...