ruby语言 - 通过查找相同的元素将数组合并到另一个数组中

时间:2012-02-27 11:38:49

标签: ruby

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中的:name包含数组B中的条目。

例如,处理数组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 个答案:

答案 0 :(得分:3)

简短版本;

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

演示here

答案 1 :(得分:1)

在ruby中,常量以大写字母开头,因此您应该使用小写字母: A => a,B => B'/ P>

a.each do |ha|
  b.each do |hb|
    if ha[:name] == hb[:name]
      ha[:link] |= []
      ha[:link] << hb
    end
  end
end

答案 2 :(得分:0)

功能方法:

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}]