我有一个对象,其中包含属性name
和data
等。我想创建一个哈希表,使用名称作为键,数据(这是一个数组)作为值。我无法弄清如何使用map
减少下面的代码。是否可能?
def fc_hash
fcs = Hash.new
self.forecasts.each do |fc|
fcs[fc.name] = fc.data
end
fcs
end
我有一个对象,其中包含属性name
和data
等。我想创建一个哈希表,使用名称作为键,数据(这是一个数组)作为值。我无法弄清如何使用map
减少下面的代码。是否可能?
def fc_hash
fcs = Hash.new
self.forecasts.each do |fc|
fcs[fc.name] = fc.data
end
fcs
end
使用Hash[]
方法:
Forecast = Struct.new(:name, :data)
forecasts = [Forecast.new('bob', 1), Forecast.new('mary', 2)]
Hash[forecasts.map{|forecast| [forecast.name, forecast.data]}]
# => {"mary"=>2, "bob"=>1}
def fc_hash
forecasts.each_with_object({}) do |forecast, hash|
hash[forecast.name] = forecast.data
end
end
inject
或reduce
来实现这个目的:self.forecasts.reduce({}) do |h,e|
h.merge(e.name => e.data)
end
Hash[*self.forecases.map{ [fc.name, fc.data]}.flatten]
Hash[]
的含义,还有在这种情况下 *
所代表的意思。它很巧妙、简洁,但一行可能有点过于强烈了。 - tadmanflatten
函数,因为Hash[]
可以接受一个数组嵌套数组的形式。在map
代码块中还有一些缺失的内容。 - mu is too short从Ruby 2.1开始,你也可以使用Array#to_h
self.forecasts.to_h { |forecast| [forecast.name, forecast.data] }
forecasts
是什么?特别是,它的类是什么? - sawaForecast
实例的数组,不是吗? - Alex Wayne{ }
几乎总是比Hash.new
更可取。唯一需要调用正式构造函数的原因是为了传递默认值,例如Hash.new(0)
或Hash.new { |h,k| ... }
。 - tadmanmap
方法。我以为在哈希情况下有一些替代方法;很高兴知道原始代码似乎没问题! :) - João Daniel