2012-11-02 31 views
-1

這個問題很容易通過手動循環和結果數組解決,您可以隨時添加。但是我正在尋找一個更加ruby式的解決方案,可能是使用注入或選擇的東西。問題如下:聰明的方法來獲得每個組中的第二項哈希數組?

arr_of_hashes = [ 
    {id: 1, val: "blah1"}, 
    {id: 1, val: "blah2"}, 
    {id: 1, val: "blah3"}, 
    {id: 2, val: "blah4"}, 
    {id: 2, val: "blah5"}, 
    {id: 3, val: "blah6"}, 
    {id: 3, val: "blah7"}, 
    {id: 3, val: "blah8"}, 
    {id: 3, val: "blah9"} 
] 

「組」由散列中的「id」字段定義。我們保證每個小組至少有兩個項目。我們要返回包含每個組的第二項的數組:

output_should_be = [ 
    {id: 1, val: "blah2"}, 
    {id: 2, val: "blah5"}, 
    {id: 3, val: "blah7"} 
] 

回答

4

「我正在尋找更具紅寶石色彩的解決方案」。我猜你的意思是functional

arr_of_hashes.chunk { |h| h[:id] }.map { |id, hs| hs[1] } 
#=> [{:id=>1, :val=>"blah2"}, {:id=>2, :val=>"blah5"}, {:id=>3, :val=>"blah7"}] 

使用group_by如果元件不被ID預先訂購。

+0

很不錯的。我幾乎沒有發佈我的'group_by'解決方案,因爲你用'chunk'解決方案打敗了我。我應該記得'chunk'。 –

1

下面是使用group_by一個解決方案:

arr_of_hashes.group_by{|h| h[:id]}.to_a.map{|id,a| a[1]} 
+0

+1,因爲它適用於所有版本。 [**這裏是證明**](http://cibox.org/slivu/stackoverflow?lang=ruby&file=clever-way-to-get-2nd-item-from-each-group-in-array-of -hashes.rb&版本= *&RUN =真) – 2012-11-02 23:13:01

相關問題