我有陣列的像這樣的數組:轉換用共同的值/鍵陣列的散列
[[1,"A"], [1,"B"], [2,"C"], [2,"D"]]
我想獲得的結果轉換爲哈希像這樣:
1 => {results => ["A","B"]}, 2 => {results => ["C","D"]}
我嘗試使用「group_by」方法,無法將其轉換爲此格式。什麼是最有效的方式來做到這一點?
任何想法?
我有陣列的像這樣的數組:轉換用共同的值/鍵陣列的散列
[[1,"A"], [1,"B"], [2,"C"], [2,"D"]]
我想獲得的結果轉換爲哈希像這樣:
1 => {results => ["A","B"]}, 2 => {results => ["C","D"]}
我嘗試使用「group_by」方法,無法將其轉換爲此格式。什麼是最有效的方式來做到這一點?
任何想法?
這是你想要的嗎?
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"]}}
我不知道爲什麼你要內心的「結果」字,但這裏是如何得到你想要的東西:
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"]]]
對於一行的情人:
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 }
a = [[1,"A"], [1,"B"], [2,"C"], [2,"D"]]
Hash[a.group_by(&:first).map{ |k, v| [k, {"results" => v.map(&:last)}]}]
你的做法是正確的,但結果並非如此。 – sawa 2012-04-13 01:33:28
已修復,希望。 – 2012-04-13 19:08:02