2016-02-28 120 views
0

我试图通过遍历它将数组转换为哈希。我有以下阵列:通过循环将红宝石数组转换为哈希

weekdays = [["Monday",2],["Tuesday",4],["Thursday",5]] 

我循环遍历数组创建一个哈希像这样:

hash_weekdays = Hash.new 
weekdays.each do |item| 
    hash_weekdays["weekday"] = item[0] 
    hash_weekdays["number"] = item[1] 
end 

然而,这只能说明我的最后一个工作日。关于从哪里出发的任何想法?谢谢!

回答

1

散列保存键值对。每个键只引用一个值,每个键在散列中都是uniq。您的密钥weekdaynumber的值将在每次迭代时被覆盖。这就是为什么你只能得到最后一次迭代的结果。

您可以将其转换为散列数组作为替代。

weekdays.map{|day, number| {weekday:day, number: number}} 
# => [{:weekday=>"Monday", :number=>2}, {:weekday=>"Tuesday", :number=>4}, {:weekday=>"Thursday", :number=>5}] 

如果你平日或数字是你的主数组中唯一可以使用它们的一种关键,而另一个作为哈希值。

weekdays.to_h 
# => {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5} 

weekdays.to_h.invert 
# => {2=>"Monday", 4=>"Tuesday", 5=>"Thursday"} 
+0

感谢您的解释@guitarman,是否有AW唉要修改我的'weekdays.each'循环来克服这个问题? – Brandon

+0

谢谢!完美的作品:) – Brandon

1

你可以这样做,而不是:

weekdays.to_h #=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5} 

或修复代码:

weekdays = [["Monday",2],["Tuesday",4],["Thursday",5]] 

hash_weekdays = Hash.new 
weekdays.each do |item| 
    hash_weekdays[item[0]] = item[1] 
end 

p hash_weekdays #=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5} 
1

您需要更改您的代码如下:

hash_weekdays = Hash.new 
weekdays.each do |item| 
    hash_weekdays[item[0]] = item[1] 
end 
hash_weekdays 
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5} 

weekdays["Monday",2])第一元件被传递到块,块变量被分配它的值:

item = ["Monday",2] 

由于需要引用的item每个元素,这是常见的是使用两种嵌段变量,其值使用并行分配被分配(又名多重分配):

day, nbr = ["Monday",2] 
    #=> ["Monday", 2] 
day #=> "Monday" 
nbr #=> 2 

这允许你写

hash_weekdays = {} # the more common way of writing hash_weekdays = Hash.new 
weekdays.each { |day, nbr| hash_weekdays[day] = nbr } # used {...} rather than do..end 
hash_weekdays 

这无疑更加清晰。

注意,首先初始化hash_weekdays到一个空的散列,那么就需要在端线hash_weekdays如果希望获得的散列的新值(作为方法的最后一行,例如)。可以通过使用该方法Enumerable#each_with_object这减少到一行(非常红宝石样):

weekdays.each_with_object({}) { |item, hash_weekdays| hash_weekdays[item[0]] = item[1] } 
    #=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5} 

声明本使用并行分配。传递到块,[["Monday", 2], {}]第一元件,被分配如下:

item, hash_weekdays = weekdays.each_with_object({}).next 
    #=> [["Monday", 2], {}] 
item 
    #=> ["Monday", 2] 
hash_weekdays 
    #=> {} 

红宝石方式是在稍微更复杂的方式来使用并行赋值:

weekdays.each_with_object({}) { |(day, nbr), hash_weekdays| 
    hash_weekdays[day] = nbr } 
    #=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5} 

正如其他人指出的那样,最直接的答案是使用方法Hash::[]或(在V2.0中引入)Array#to_h

Hash[weekdays] 
    #=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5} 

Hash[*weekdays.flatten] #=> Hash["Monday", 2, "Tuesday", 4, "Thursday", 5] 
    #=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5} 

weekdays.to_h 
    #=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}