2012-04-12 44 views
2

我有陣列的像這樣的數組:轉換用共同的值/鍵陣列的散列

[[1,"A"], [1,"B"], [2,"C"], [2,"D"]] 

我想獲得的結果轉換爲哈希像這樣:

1 => {results => ["A","B"]}, 2 => {results => ["C","D"]} 

我嘗試使用「group_by」方法,無法將其轉換爲此格式。什麼是最有效的方式來做到這一點?

任何想法?

回答

2

這是你想要的嗎?

irb(main):001:0> a=[[1,"A"], [1,"B"], [2,"C"], [2,"D"]] 
=> [[1, "A"], [1, "B"], [2, "C"], [2, "D"]] 

irb(main):002:0> h={} 
=> {} 

irb(main):003:0> a.each { |k,v| h[k] ||= []; h[k] << v } 
=> [[1, "A"], [1, "B"], [2, "C"], [2, "D"]] 

irb(main):004:0> h 
=> {1=>["A", "B"], 2=>["C", "D"]} 

或者,如果你真的想哈希表中有「結果」鍵哈希表:

irb(main):003:0> a.each { |k,v| h[k] ||= {}; h[k]['result'] ||= []; h[k]['result'] << v } 
=> [[1, "A"], [1, "B"], [2, "C"], [2, "D"]] 
irb(main):004:0> h 
=> {1=>{"result"=>["A", "B"]}, 2=>{"result"=>["C", "D"]}} 
+0

你的做法是正確的,但結果並非如此。 – sawa 2012-04-13 01:33:28

+0

已修復,希望。 – 2012-04-13 19:08:02

1

我不知道爲什麼你要內心的「結果」字,但這裏是如何得到你想要的東西:

the_list = [[1,"A"], [1,"B"], [2,"C"], [2,"D"]] 
#=> [[1, "A"], [1, "B"], [2, "C"], [2, "D"]] 

by_key = the_list.group_by(&:first) 
#=> {1=>[[1, "A"], [1, "B"]], 2=>[[2, "C"], [2, "D"]]} 

as_result_hash = by_key.map do |key, matches| 
    [key, {'results'=>matches.map(&:last) }] 
end 
#=> [[1, {"results"=>["A", "B"]}], [2, {"results"=>["C", "D"]}]] 

final = Hash[*as_result_hash.flatten(1)] 
#=> {1=>{"results"=>["A", "B"]}, 2=>{"results"=>["C", "D"]}} 

這聽起來像你已經有想出GROUP_BY的基本用法 - 你可以得到一組由一些關鍵的分組結果。

下一步是將這些結果映射到您想要的格式。爲此,我們只需映射by_key字典,返回原始鍵和映射結果。

這將返回一個數組,因此我們使用Hash[*array.flatten(1)]將其轉換回字典。


,如果你不需要內部 '結果',你可以做:

as_result_hash = by_key.map do |key, matches| 
    [key, matches.map(&:last)] 
end 
#=> [[1, ["A", "B"]], [2, ["C", "D"]]] 
2

對於一行的情人:

a = [[1,"A"], [1,"B"], [2,"C"], [2,"D"]] 
a.inject(Hash.new { |h, k| h[k] = {"results" => []} }) { |h, e| h[e.first]["results"] << e.last; h } 
1
a = [[1,"A"], [1,"B"], [2,"C"], [2,"D"]] 
Hash[a.group_by(&:first).map{ |k, v| [k, {"results" => v.map(&:last)}]}]