在Ruby中合并两个集合以简化代码

时间:2012-08-23 10:03:57

标签: ruby

这是Ruby中的代码。我只是想简化它。你有什么想法吗?

def foo
   points = some_collection.map { |item| {:key1 => item.key1, :key2 => item.key2, :key3 => item.key3, :key4=> item.key4} }

   some_collection2.each do |item2|
    points << {:key1 => item2.key1, :key2 => item2.key2, :key3 => item2.key3, :key4=> item2.key4}
   end

   points
end

3 个答案:

答案 0 :(得分:2)

我会将两个集合的转换结果存储到两个数组中,然后将它们一起添加。

def foo
   a1 = some_collection.map do |item| 
     {:key1 => item.method1, :key2 => item.method2, :key3 => item.key4, :key5=> item.key5}
   end
   a2 = some_collection2.map do |item|
    {:key1 => item.method1, :key2 => item.method2, :key3 => item.key4, :key5=> item.key5}
   end

   a1 + a2
end

或者,如果你愿意,它甚至可以成为这个

def foo
   some_collection.map do |item| 
     {:key1 => item.method1, :key2 => item.method2, :key3 => item.key4, :key5=> item.key5}
   end + some_collection2.map do |item2|
    {:key1 => item.method1, :key2 => item.method2, :key3 => item.key4, :key5=> item.key5}
   end
end

答案 1 :(得分:2)

如果我理解正确,那么两个集合的映射函数都是相同的。

points = (some_collection + some_collection2).map do |item|
  {:key1 => item.method1, :key2 => item.method2, :key3 => item.key4, :key5=> item.key5}
end

答案 2 :(得分:1)

您甚至可以在单独的数组中提取键列表,因此您将拥有:

keys = [:key1, :key2, :key3, :key4]

points = (some_collection + some_collection2).map do |item|
  Hash[keys.map{|key| [key, item.send(key)]}]
end