将数组转换为哈希

时间:2014-04-01 08:57:09

标签: ruby hash

任何人都可以解释一下如何将数组转换为Hash吗?

puts Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]

当我们致电happens时,我不明白Hash[*[]]].flatten]背后的原因。

5 个答案:

答案 0 :(得分:2)

你只需要这样做:

Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']]]
# => {:first_name=>"Shane", :last_name=>"Harvie"}

查看documentation语法:

Hash[ key, value, ... ] → new_hash 
Hash[ [ [key, value], ... ] ] → new_hash 

如果您使用faltten,则结果如下: -

[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
# => [[:first_name, "Shane", :last_name, "Harvie"]]

如果你确实使用 splat faltten,那么你会得到以下信息:

[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
# => [:first_name, "Shane", :last_name, "Harvie"]

现在,Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]将为您提供哈希值,正如我的顶级代码所给出的那样。但由于Hash 文档与输入数据明显匹配,因此您不需要做太多工作,因此只有Hash[input_data]就足够了。

答案 1 :(得分:2)

Hash类定义方法[]。此方法接受任意数量的参数,获取每对并创建一个新哈希,每对的第一个元素是键,第二个元素是值。如果你传递奇数量的ov参数,这将失败。它还允许您传递2d数组或任意数量的2个元素数组。

现在你有了2d数组:[[:first_name, 'Shane'], [:last_name, 'Harvie']]。当您调用flatten时,将所有内部数组合并为一个:

Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
Hash[[:first_name, 'Shane', :last_name, 'Harvie']]

现在,如果使用splat运算符,则提取所有元素并将它们作为单独的参数传递给[]方法,因此转换为:

Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
Hash[:first_name, 'Shane', :last_name, 'Harvie']

但请注意,不需要它 - Hash[]可以处理初始表单。只是做:

Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']]]

答案 2 :(得分:1)

首先将数组展平:

[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten
# becomes: [:first_name, 'Shane', :last_name, 'Harvie']

由于Hash#[] method接受任意数量的参数,如此

Hash['a', 'b', 'c', 'd']

而不是数组,你需要使用splat运算符(*)来扩展堆栈上的数组,以便将值用作参数

Hash[*[:first_name, 'Shane', :last_name, 'Harvie']]
# becomes: Hash[:first_name, 'Shane', :last_name, 'Harvie']

Arup是对的,你不需要展平,因为Hash#[]方法也接受2d数组。

答案 3 :(得分:1)

我们在不使用splat *的情况下得到的结果: -

[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
#=> [[:first_name, "Shane", :last_name, "Harvie"]]

所以在这里你得到一个2D数组和''=> “”。

现在,让我们看看我们使用splat *得到了什么: -

[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
#=> [:first_name, "Shane", :last_name, "Harvie"]

这里有1D数组,因此splat导致内部数组从容器数组中出来。

因此Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]Hash[:first_name, "Shane", :last_name, "Harvie"]

相同
#=> {:first_name=>"Shane", :last_name=>"Harvie"}

答案 4 :(得分:1)

Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]

我们能做的最好的事情就是从内部开始,然后向外走。

在最里面的部分,你有两个数组,每个数组有两个元素: 符号和字符串。

要使用下一组括号,我们有一个包含这两个数组的数组。

flatten将内部的两个数组变平,这样我们就有一个数组包含元素,而不是包含另外两个数组的数组。

star(*)运算符,将数组扩展为要在函数中使用的参数列表。

所以

[:first_name, 'Shane', :last_name, 'Harvie']

将变成

:first_name, 'Shane', :last_name, 'Harvie'

最后一部分是Hash []

这是一个函数,它接受一组参数并将它们变成一个哈希。

{:first_name=>'Shane', :last_name=>'Harvie'}

瞧。它比起初看起来更简单。

<强>观察:

如果你看一下Hash的文档,你会发现你可能刚刚将多个数组传递给了Hash []并且会处理它。

<强>参考文献: