2015-08-13 64 views
-2

我有一个属性为A和B的对象列表。是否有一种单行方式来将B值存储在按A值分组的数组中,在一个循环中? (不是group_by,然后映射)结果,我会有一个数组数组。group_by一个属性并映射另一个属性?

result[a1] = [b1, b4, b5] 

编辑:显然我不够清楚,对不起。 我有这样的对象的列表:

class MyObject 
    attr_accessor :attrA, :attrB 
end 

,我想这需要MyObjects的列表,并返回所有由ATTRA值分组的attrB值的方法。

克里斯蒂安回答是好,如果没有一个班轮这样做,这将是公认的答案

+3

最好使用简单的代码示例来帮助描述问题。 –

+0

请提供某种形式的输入/输出规格,以便我们能够更好地解决此问题。另外为什么不'group_by然后映射这个可以仍然是1班轮? – engineersmnky

回答

1

是一个两班轮好吗?使用默认的空数组值设置结果散列,然后遍历您的项目,将所需值链接到所需组。

list = [ 
    ['a', 1], 
    ['b', 2], 
    ['a', 3], 
    ['b', 4] 
] 

result = Hash.new { |h, k| h[k] = [] } 
list.each do |item| 
    result[item.first] << item.last 
end 
puts result.inspect 
# {"a"=>[1, 3], "b"=>[2, 4]} 
+1

您需要将'key'更改为'group',反之亦然。编写'list.each_with_object(Hash.new {| h,k | h [k] = []}){|(key,value),result |结果[key] << value}'。 –

+1

你可以使用'Enumerable#each_with_object'来创建一个班轮'list.each_with_object(Hash.new {| h,k | h [k] = []}){| a,h | h [a.a] << a.b}' – engineersmnky

+0

感谢您的错字捕获,并且我更新了它以使'item'看起来更像是一些任意的对象。我喜欢'each_with_object'解决方案的单线性,但也发现它的可读性稍差,所以我将它留给代码打高尔夫球:) –