2013-04-24 58 views
1

假設我有這個數組通過元素散列分組

x=[{:shipping_id=>2, :fsn=>"ab", :price=>300, :quantity=>1}, 
    {:shipping_id=>3, :fsn=>"abc",:price=>500, :quantity=>2}, 
    {:shipping_id=>2, :fsn=>"abcd",:price=>300,:quantity=>3}, 
    {:shipping_id=>4, :fsn=>"abx", :price=>600,:quantity=>1}, 
    {:shipping_id=>3, :fsn=>"abb", :price=>400,:quantity=>1}] 

我想通過唯一運送ID組,但在這種情況下,我們只是一羣被shipping_id = 2

所以我做x.select! {|y| y[:shipping_id]==2}這給了我

[{:shipping_id=>2, :fsn=>"ab",:price=>300,:quantity=>1}, {:shipping_id=>2, :fsn=>"abcd",:price=>300,:quantity=>3}] 

但問題是,我想以這種形式

我的結果

我該怎麼辦?我可以在幾行中做到這一點,但有沒有優化的方式呢?

更新 - : 最終工作溶液(我的解決方案) -

控制器

new_params={} 
order_hash.each do |row| 
     new_params=row.convert_to_params(new_params) 
end 
params.merge!(new_params) 

型號

def convert_to_params(new_params) 
    item=self.instance_values.symbolize_keys 
    item.each do |k, v| 
     new_params[k].nil? ? new_params[k]=[v] : new_params[k].push(v) 
    end 
    return new_params 
end 

這給了我希望的結果

+0

我不同意這個過於本地化。我不認爲這個問題應該被關閉。這個問題的核心有一個通用的分組算法,可以用於其他人。 – 2013-04-25 13:11:04

+0

@JimStewart - 我同意,我真的不認爲這是一個普通的問題。無論如何,愛我的解決方案是相當整潔的事實。 – 2013-04-26 19:22:48

回答

1
arr = x= [{:shipping_id=>2, :fsn=>"ab"}, 
{:shipping_id=>3, :fsn=>"abc"}, {:shipping_id=>2, :fsn=>"abcd"}, 
{:shipping_id=>4, :fsn=>"abx"}, {:shipping_id=>3, :fsn=>"abb"}] 
@h = {} 
arr.group_by {|x| x[:shipping_id]==2 }[true].inject({}) do |mem,i| 
    i.each{|k,v| mem[k] = [v] << mem[k] ; @h = mem} 
end 
p @h #=> {:shipping_id=>[2, 2], :fsn=>["abcd", "ab"]} 
+0

非常感謝... – 2013-04-24 17:52:34

+0

它不僅僅是幫助....我非常喜歡解。如果可以的話,會給它2票。 :-) – 2013-04-24 18:09:54

+0

@PraktikBothra我的榮幸!但'@ h'在這裏有重要的作用。我花了更多時間來完成這項工作。 atlast @h幫助我。 – 2013-04-24 18:16:08

1

你可以做:

ret = Hash[x.group_by {|e| e[:shipping_id]}.map {|e| [e.first, e.last.map {|t| t[:fsn]}]}] 

,然後,如果你只需要爲shipping_id = 2

> ret[2] 
=> ["ab", "abcd"] 
+0

不錯的嘗試,但我也想在數組中的shipping_id,即使它們是相同的。這看起來很長。 – 2013-04-24 14:44:55

+0

所以我得到了這樣的結果{2 => [「ab」,「abcd」],3 => [「abc」,「abb」],4 => [「abx」]}。讓group_by成爲現在。不管怎麼說,多謝拉。 – 2013-04-24 14:47:27

+0

@PraktikBothra需要一個重複運送ID列表是一個非常奇怪的要求。如果添加一些關於該域的信息,可能會得到一些關於如何更好地構建解決方案的建議。 – harbichidian 2013-04-24 14:55:45

0

編輯者:

>> z = x.group_by {|y| y[:shipping_id] } 
#=> {2=>[{:shipping_id=>2, :fsn=>"ab"}, {:shipping_id=>2, :fsn=>"abcd"}], 3=>[{:shipping_id=>3, :fsn=>"abc"}, {:shipping_id=>3, :fsn=>"abb"}], 4=>[{:shipping_id=>4, :fsn=>"abx"}]} 

>> Hash[z.map {|k, v| Array[[k]*v.count, v] }] 
#=> {[2, 2]=>[{:shipping_id=>2, :fsn=>"ab"}, {:shipping_id=>2, :fsn=>"abcd"}], [3, 3]=>[{:shipping_id=>3, :fsn=>"abc"}, {:shipping_id=>3, :fsn=>"abb"}], [4]=>[{:shipping_id=>4, :fsn=>"abx"}]} 

不正是你需要的,還是離開它這裏如果你發現它有用。