我有一个数组,以及一个返回给定值的值的函数。最后,我想创建一个hashmap,它将数组的值作为键值,并将f(key_value)的结果作为值。是否有一个干净,简单的方法,就像使用块的每个/ map一样,这样做?
所以相当于
的东西hsh = {}
[1,2,3,4].each do |x|
hsh[x] = f(x)
end
但看起来更像这个,因为它简单而且一行?
results = array.map { | x | f(x) }
答案 0 :(得分:102)
请注意,自Ruby 2.1.0起,您也可以使用Array#to_h,如下所示:
[1,2,3,4].map{ |x| [x, f(x)] }.to_h
答案 1 :(得分:27)
您还可以将函数定义为哈希的默认值:
hash = Hash.new {|hash, key| hash[key] = f(key) }
然后,当您查找值时,哈希将计算并存储它。
hash[10]
hash.inspect #=> { 10 => whatever_the_result_is }
答案 2 :(得分:21)
您需要each_with_object
。
def f x
x * 2
end
t = [1, 2, 3, 4].each_with_object({}) do |x, memo|
memo[x] = f(x)
end
t # => {1=>2, 2=>4, 3=>6, 4=>8}
另一个:
t2 = [1, 2, 3, 4].map{|x| [x, f(x)]}
Hash[t2] # => {1=>2, 2=>4, 3=>6, 4=>8}
答案 3 :(得分:21)
查看Hash::[]方法。
Hash[ [1,2,3,4].collect { |x| [x, f(x)] } ]
答案 4 :(得分:8)
使用Facets'mash(将可枚举转换为哈希的方法):
[1, 2, 3, 4].mash { |x| [x, f(x)] }
来自Ruby 2.1:
[1, 2, 3, 4].map { |x| [x, f(x)] }.to_h
答案 5 :(得分:4)
Ruby 2.6.0启用passing a block to the to_h
-method。这样可以使用更短的语法从数组创建哈希:
[1, 2, 3, 4].to_h { |x| [x, f(x)] }
答案 6 :(得分:0)
您正在寻找reduce()|inject()
method:
elem = [1,2,3,4]
h = elem.reduce({}) do |res, x|
res[x] = x**2
res
end
puts h
传递给reduce({})
的参数是作为res
变量传递给块的中间对象的初始值。在每个迭代中,我们都将新对key: value
添加到res
哈希中,并重现要在下一次迭代中使用的哈希。
上面的方法会预先计算非常实用的平方值散列:
{1=>1, 2=>4, 3=>9, 4=>16}