2015-08-13 65 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'解決方案的單線性,但也發現它的可讀性稍差,所以我將它留給代碼打高爾夫球:) –