使用Var命名Var

时间:2014-10-20 22:23:06

标签: ruby arrays hashmap

我试图动态创建数组并且正在搞乱这段代码,但我没有到达任何地方。

locations开始:

locations = {"boston" => 1, "new_york" => 2 , "miami" => 3}

使用:

locations.each {
|city, id|  puts "#{city}_angels"
}

理想的结果是初始化三个数组:boston_angelsnew_york_angelsmiami_angels

2 个答案:

答案 0 :(得分:2)

根据对问题的评论,有很多方法可以从源可枚举构造哈希。 each_with_object是我的最爱之一:

locations.keys.each_with_object({}) {|city, out| out[city] = [] }

inject / reduce是另一种选择:

locations.keys.inject({}) {|h, city| h[city] = []; h }

您还可以创建一个[city, []]数组数组,然后将其转换为哈希:

Hash[*locations.flat_map {|city, id| [city, []] }]

或者如果您使用的是Ruby 2.1:

locations.keys.map {|k| [k, []] }.to_h

答案 1 :(得分:1)

这个问题与哈希location的值无关,所以让我们从:

开始
cities = locations.keys
  #=> ["boston", "new_york", "miami"]

其他三种方法:

<强>#1

Hash[cities.map { |c| [c, []] }]
  #=> {"boston"=>[], "new_york"=>[], "miami"=>[]}

使用Ruby 2.1+,您可以将Hash[arr]写为arr.to_h

<强>#2

cities.reduce({}) { |h,city| h.merge({ city=>[] }) }

<强>#3

h = Hash.new { |h,k| h[k] = [] }
h.values_at(*cities)
h
  #=> {"boston"=>[], "new_york"=>[], "miami"=>[]}