我已经包含了给定的代码:
@classes = {1=>"USA", 3=>"France", 2=>"UK", 5=>"Europe", 7=>"Delhi", 8=>"test"}
@amaze = params[:test] #I get "1,3,7"
我明白了,现在请指导我如何将密钥与@amaze
匹配,并相应地从@classes
获取其值,即美国,法国,德里。
答案 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"]