2

这是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
4

3 回答 3

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
于 2012-08-23T10:24:35.243 回答
2

如果我理解正确,在您的情况下,两个集合的映射功能是相同的。

points = (some_collection + some_collection2).map do |item|
  {:key1 => item.method1, :key2 => item.method2, :key3 => item.key4, :key5=> item.key5}
end
于 2012-08-23T11:32:45.500 回答
1

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

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

points = (some_collection + some_collection2).map do |item|
  Hash[keys.map{|key| [key, item.send(key)]}]
end
于 2012-08-23T12:49:43.847 回答