Arrays 在Ruby中将多维数组转换为哈希

Arrays 在Ruby中将多维数组转换为哈希,arrays,ruby,Arrays,Ruby,我输入了如下内容: input = [['abc',['xyz','1.1']], ['abc',['xyz','1.2']],['def',['lmn','3.14']]] 我想把这个转换成 {'abc'=>[{'xyz'=>'1.1'},{'xyz'=>'1.2'}],'def'=>[{'lmn'=>'3.14'}]} 执行此操作的最佳方法是什么?您可以使用每个带有对象的\u: accumulator = Hash.new { |k,v| k[v] = []

我输入了如下内容:

input = [['abc',['xyz','1.1']], ['abc',['xyz','1.2']],['def',['lmn','3.14']]]
我想把这个转换成

{'abc'=>[{'xyz'=>'1.1'},{'xyz'=>'1.2'}],'def'=>[{'lmn'=>'3.14'}]}

执行此操作的最佳方法是什么?

您可以使用
每个带有对象的\u

accumulator = Hash.new { |k,v| k[v] = [] }

input.each_with_object(accumulator) {|(f, s), memo| memo[f] << Hash[*s] }
#=> {"abc"=>[{"xyz"=>"1.1"}, {"xyz"=>"1.2"}], "def"=>[{"lmn"=>"3.14"}]}
acculator=Hash.new{| k,v | k[v]=[]
输入。每个_与_对象(累加器){|(f,s),memo{“abc”=>[{“xyz”=>“1.1”},{“xyz”=>“1.2”}],“def”=>[{“lmn”=>“3.14”}
这里是另一个选项:

accumulated = {}

input.each { |k, v| accumulated[k]&.push(Hash[*v]) || accumulated[k] = [Hash[*v]] }

#=> accumulated
#=> {"abc"=>[{"xyz"=>"1.1"}, {"xyz"=>"1.2"}], "def"=>[{"lmn"=>"3.14"}]}

如果您使用的是Rails,如果您觉得安全导航操作符(
&
)更可读,可以用
try()
替换它:

input.each { |k, v| accumulated[k].try(:push, Hash[*v]) || accumulated[k] = [Hash[*v]] }
还有一种方法:

input.inject({}) { |a, (k, v)| a.merge(k => [Hash[*v]]) { |_, o, n| o + n } }

Ilya指出,
merge!
应该优先于
merge
,因为它有更好的性能特性。

try方法来自哪里?都不是,或者文档中定义了try方法。@iain Oh derp–是的,对不起,
try
实际上是Rails方法。我会更新我的答案因此,请不要使用“已编辑”或“已更新”在修改答案时键入标记。而不是将信息合并到最初放置的位置。我们可以看到更改的内容以及必要时的更改。解释得很好。答案很好。但是,当您可以使用
每个对象时,为什么要使用
每个对象呢?这就是我的想法:
输入。每个{f,s |累加器[f]@Raffael,您当然可以使用
每个
,但这不会返回
累加器
。例如,如果要将其包装在一个方法中,则需要最后一行是
累加器
每个带对象的
,相反,它会返回对象(
备注
)。此外,
累加器
可以被替换掉,与使用
每个
相比,节省了两条语句,并且还限制了
备忘录
的范围。是的,调用
每个
后,结果将存储在
累加器
中。对不起,我认为这是显而易见的。如果你想返回结果,我愿意ndeed建议您添加另一行代码。我建议您添加另一行代码是出于个人偏好。我更喜欢清晰易读的代码,而不是短代码。
merge!
会更有效。@kaikuchn太棒了!我还有一件事要做。我如何才能做到这一点?
{'abc'=>[{'xyz'=>{'value'=>1.1'}},{'xyz value'=>{'value'=>1.2'}],'def'=>[{'lmn'=>{'value'=>3.14'}]}
这就是你可以做的:
input.injection({}){a,(k,(ik,v)){a.merge!(k=>[{'ik=>{'value'=>v}}]){{u124;,o,n{o+n}
但老实说,这变得非常复杂,速度非常快。因此,除非这是您只想在irb中执行的一次性操作,否则我建议您使用表达性变量名,并可能将转换拆分为更容易理解的部分。请阅读“包括链接页面”和“。我们希望看到你努力的证据。你尝试了什么?你搜索了什么都没有找到吗?你找到了东西但没有帮助吗?你尝试过编写代码吗?如果没有,为什么?如果是,最小的代码示例是什么,显示了你尝试了什么,为什么没有成功?如果没有,看起来你没有尝试,希望我们为你编写代码。