2014-09-29 2 views
1

Мне интересно, как объединить эти два массива в один чистый массив в Ruby
Оба массива имеют одну подобную пару ключей: значение. Я пытаюсь объединить информацию из этих двух отдельных массивов, которые имеют информацию для одного и того же человека. Один массив имеет свое имя. У другого массива есть работа и возраст. Оба массива имеют идентификатор, соответствующий одному человеку.
Пример того, что я пытаюсь сделатьОбъедините два массива, у которых есть пары ключевых значений (Ruby)

array1 = [ {:id => 1, :name => "Bob"}, {:id => 2, :name => "Tim"}] 
array2 = [ {:id => 1, :job => "firefighter", :age => 25}, { :id => 2, :job => "accountant",  :age => 30} ] 


new_array = [ {:id=> 1, name => "Bob", :job => "firefighter", :age => 25}, { :id => 2, :name => "Tim", :job => "accountant", :age => 30} ] 
+0

Это непонятно : «Оба массива имеют один похожий ключ: пара значений». А что такое «субъект»? – sawa

+0

предметом является человек. Один массив имеет свое имя. У другого массива есть работа и возраст. Оба массива имеют идентификатор, соответствующий одному человеку. –

ответ

3

Вы могли бы сделать что-то вроде этого:

new_array = array1.each_with_index.map { |x, i| x.merge array2[i] } 
# => [{:id=>1, :name=>"Bob", :job=>"firefighter", :age=>25}, {:id=>2, :name=>"Tim", :job=>"accountant", :age=>30}] 

Если вы хотите решение, которое не зависит от того массива, а вместо использует :id соответствовать хеши:

array1.map { |x| x.merge (array2.find { |h| h[:id] == x[:id] } || {}) } 
+0

Спасибо, что он сработал отлично! :) –

1

Если два массива содержат одинаковые значения :id в го е те же места:

array1.zip(array2).map { |g,h| g.merge(h) } 
    #=> [{:id=>1, :name=>"Bob", :job=>"firefighter", :age=>25}, 
    # {:id=>2, :name=>"Tim", :job=>"accountant", :age=>30}] 

или, что эквивалентно:

[array1, array2].transpose.map { |g,h| g.merge(h) } 

Если два массива содержат одни и те же :id значения, но не обязательно в одних и тех же местах:

(array1 + array2).group_by { |h| h[:id] } 
       .values 
       .map { |g,h| g.merge(h) } 

или

array1.sort_by { |h| h[:id] } 
     .zip(array2.sort_by { |h| h[:id] }) 
     .map { |g,h| g.merge(h) } 
Смежные вопросы