Ruby-将数组映射到hashmap

我有一个数组,以及一个返回给定值的值的函数。 最终,我想创建一个哈希表,将数组的值作为键值,并将f(key_value)的结果作为值。 是否有一种干净,简单的方法(类似于Array的每个/映射)使用block进行此操作?

所以相当于

hsh = {}
[1,2,3,4].each do |x|
  hsh[x] = f(x)
end

但看起来与此更相似,因为它很简单,只有一行?

results = array.map { | x | f(x) }
Ji Mun asked 2020-01-12T15:38:21Z
7个解决方案
107 votes

请注意,从Ruby 2.1.0开始,您还可以使用Array#to_h,如下所示:

[1,2,3,4].map{ |x| [x, f(x)] }.to_h
Knotty66 answered 2020-01-12T15:39:09Z
28 votes

您还可以将函数定义为哈希的默认值:

hash = Hash.new {|hash, key| hash[key] = f(key) }

然后,当您查找值时,哈希将立即计算并存储。

hash[10]
hash.inspect #=> { 10 => whatever_the_result_is }
Zach Kemp answered 2020-01-12T15:38:49Z
22 votes

您需要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}
Sergio Tulentsev answered 2020-01-12T15:39:33Z
21 votes

检出Hash :: []方法。

Hash[ [1,2,3,4].collect { |x| [x, f(x)] } ]
Matt Huggins answered 2020-01-12T15:39:53Z
8 votes

使用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
tokland answered 2020-01-12T15:40:17Z
6 votes

Ruby 2.6.0允许将块传递给to_h方法。 这样可以使用更短的语法从数组创建哈希:

[1, 2, 3, 4].to_h { |x| [x, f(x)] }
Timitry answered 2020-01-12T15:40:38Z
0 votes

您正在寻找reduce({})方法:

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}
Tombart answered 2020-01-12T15:41:08Z
translate from https://stackoverflow.com:/questions/13017501/ruby-mapping-an-array-to-hashmap