匹配hash的键,然后在ruby中相应地获取值

时间:2015-07-10 12:50:37

标签: ruby-on-rails ruby ruby-on-rails-4

我已经包含了给定的代码:

@classes = {1=>"USA", 3=>"France", 2=>"UK",  5=>"Europe", 7=>"Delhi", 8=>"test"}
@amaze = params[:test]  #I get "1,3,7"

我明白了,现在请指导我如何将密钥与@amaze匹配,并相应地从@classes获取其值,即美国,法国,德里。

5 个答案:

答案 0 :(得分:1)

由于@amaze只是一个字符串,我们先让它在Array中转换,以便于枚举:

@amaze = "1,3,7"
@amaze = @amaze.split(",")
# => ["1", "3", "7"]

现在,因为所有键都提取了所有值:

@amaze.map { |i| @classes[i.to_i] }
# => ["USA", "France", "Delhi"]

答案 1 :(得分:1)

@amaze拆分为,并获取一组键,将它们转换为整数,然后仅选择键到这个键组中的键/值对。像这样:

@classes = {1=>"USA", 3=>"France", 2=>"UK",  5=>"Europe", 7=>"Delhi", 8=>"test"}
@amaze = "1,3,7"  #I get "1,3,7"
arr = @amaze.split(',').map(&:to_i)
p @classes.select{|el| arr.include? el}

结果:

#> {1=>"USA", 3=>"France", 7=>"Delhi"}

如果您希望值仅使用.values

p @classes.select{|el| arr.include? el}.values

结果:

#> ["USA", "France", "Delhi"]

答案 2 :(得分:0)

对于(看似)您要问的内容,以下行将执行此操作:

@amaze.split(",").each { |i| p @classes[i.to_i] }

# If @amaza = "1,3,7", above line will output:
# => "USA"
#    "France"
#    "UK"

答案 3 :(得分:0)

我认为更清楚地了解哈希会帮助你。

Hash是一个数据结构,它是键值对的列表。例如,以下是键值对的哈希对象(您的示例):

@classes = {1=>"USA", 3=>"France", 2=>"UK",  5=>"Europe", 7=>"Delhi", 8=>"test"}

如果要从@classes中提取值,则需要传递所需值的键。如果我们想要"USA",我们会将1的密钥传递给@classes。如果我们想要"France",我们会将3

的密钥传递给它

@classes[1]将返回"USA"@classes[3]将返回"France"

根据您的问题,不清楚数据结构@amaze是什么,但我们可以说它是字符串"1, 3, 7",我们可以将其拆分为创建数组[1, 3, 7]

您可以遍历数组以获取@classes

中的每个值
@amaze.split(",").map(&:to_i).each do |key|
  puts @classes[key]
end

这会将每个相应的值打印到@classes中的键。

答案 4 :(得分:0)

这应该适合你:

@classes = {1=>"USA", 3=>"France", 2=>"UK",  5=>"Europe", 7=>"Delhi", 8=>"test"}
@amaze = params[:test].split(",").map(&:to_i) 
@classes.values_at(*@amaze)
#=> ["USA", "France", "Delhi"]

Hash#values_at接受无限数量的键并将其值作为数组返回。 *(splat)运算符会展开数组,因此此调用实际上变为@classes.values_at(1,3,7) Docs

如果密钥不存在,可能还希望在末尾添加compact。 e.g

@amaze = params[:test].split(",").map(&:to_i) # Asssume this returns [1,3,7,9]
@classes.values_at(*@amaze)
#=> ["USA", "France", "Delhi",nil]
@classes.values_at(*@amaze).compact
#=> ["USA", "France", "Delhi"]