Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将具有公共值/键的数组转换为哈希_Ruby_Arrays_Hash - Fatal编程技术网

Ruby 将具有公共值/键的数组转换为哈希

Ruby 将具有公共值/键的数组转换为哈希,ruby,arrays,hash,Ruby,Arrays,Hash,我有这样一个数组: [[1,"A"], [1,"B"], [2,"C"], [2,"D"]] 我想将结果放入如下的散列: 1 => {results => ["A","B"]}, 2 => {results => ["C","D"]} 我试着使用“groupby”方法,但没能把它变成这种形式。最有效的方法是什么 有什么想法吗 这就是你想要的吗 irb(main):001:0> a=[[1,"A"], [1,"B"], [2,"C"], [2,"D"]] =>

我有这样一个数组:

[[1,"A"], [1,"B"], [2,"C"], [2,"D"]]
我想将结果放入如下的散列:

1 => {results => ["A","B"]}, 2 => {results => ["C","D"]}
我试着使用“groupby”方法,但没能把它变成这种形式。最有效的方法是什么

有什么想法吗

这就是你想要的吗

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):001:0>a=[[1,“a”],[1,“B”],[2,“C”],[2,“D”]
=>[[1,“A”],[1,“B”],[2,“C”],[2,“D”]]
irb(主):002:0>h={}
=> {}
irb(main):003:0>a.each{| k,v | h[k]| h[k][[1,a][1,B][2,C][2,D][]
irb(主):004:0>h
=>{1=>[“A”,“B”],2=>[“C”,“D”]}
或者,如果您确实想要一个具有“result”键的哈希表的哈希表:

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"]}}
irb(main):003:0>a.each{k,v|h[k]{};h[k]['result'].[k]['result']][[1,“a”],[1,“B”],[2,“C”],[2,“D”]
irb(主):004:0>h
=>{1=>{“结果”=>[“A”,“B”]},2=>{“结果”=>[“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.flant(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”]

a、 inject(Hash.new{{124; h,k{124; h[k]={“results”=>[]}}}{124; h,e{124; h[e.first][“results”]您的方法是正确的,但结果并不是所要求的。
a = [[1,"A"], [1,"B"], [2,"C"], [2,"D"]]
Hash[a.group_by(&:first).map{ |k, v| [k, {"results" => v.map(&:last)}]}]