ruby language - объединить массив в другой, найдя тот же элемент - PullRequest
0 голосов
/ 27 февраля 2012
A = [
  { :id => 1, :name => 'good', :link => nil },
  { :id => 2, :name => 'bad', :link => nil } 
]

B = [
  { :id => 3, :name => 'good' },
  { :id => 4, :name => 'good' }, 
  { :id => 5, :name => 'bad' } 
]

Мне нужно объединить массив B в A, чтобы :link в массиве A включал запись в массив B, если :name является одинаковым значением в каждом массиве.

Например, послемассив обработки A должен быть:

A = [
  { :id => 1, :name => 'good', :link => [{ :id => 3, :name => 'good' }, { :id => 4, :name => 'good' }] },
  { :id => 2, :name => 'bad', :link => [{ :id => 5, :name => 'bad' }] }
]

спасибо.

Ответы [ 3 ]

3 голосов
/ 27 февраля 2012

короткая версия;

a.each { | item | item[:link] = b.find_all { | x | x[:name] == item[:name] } }

Демо здесь .

1 голос
/ 27 февраля 2012

В ruby ​​константы начинаются с заглавной буквы, поэтому вы должны использовать строчную букву: A => a, B => b

a.each do |ha|
  b.each do |hb|
    if ha[:name] == hb[:name]
      ha[:link] |= []
      ha[:link] << hb
    end
  end
end
0 голосов
/ 27 февраля 2012

Функциональный подход:

B_grouped = B.group_by { |h| h[:name]  }
A2 = A.map { |h| h.merge(:link => B_grouped[h[:name]]) }
#=> [{:link=>[{:name=>"good", :id=>3}, {:name=>"good", :id=>4}], :name=>"good", :id=>1},
#    {:link=>[{:name=>"bad", :id=>5}], :name=>"bad", :id=>2}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...