我有一个看起来像这样的哈希:
params = { :irrelevant => "A String", :choice1 => "Oh look, another one", :choice2 => "Even more strings", :choice3 => "But wait", :irrelevant2 => "The last string" }
而且我想要一种简单的方法来拒绝所有不是选择+整数的键。它可以是choice1,或choice1 到choice10。它因人而异。
如何仅使用单词选择和后面的一个或多个数字来挑出键?
奖金:
将散列转换为以制表符 (\t) 作为分隔符的字符串。我这样做了,但它需要几行代码。通常,Rubicians 大师可以在一行左右的时间内完成。
编辑为原始答案 :即使这是答案(截至本评论时)是所选答案,但此答案的原始版本已过时。
我在这里添加了一个更新,以帮助其他人避免像我一样被这个答案所迷惑。
正如其他答案所提到的,Ruby >= 2.5 添加了Hash#slice以前仅在 Rails 中可用的方法。
Hash#slice
例子:
> { one: 1, two: 2, three: 3 }.slice(:one, :two) => {:one=>1, :two=>2}
编辑结束。 下面是最初的答案,我想如果你在没有 Rails 的情况下使用 Ruby < 2.5,它会很有用,尽管我认为这种情况在这一点上相当罕见。
如果您使用的是 Ruby,则可以使用该select方法。您需要将键从符号转换为字符串以进行正则表达式匹配。这将为您提供一个仅包含选项的新哈希。
select
choices = params.select { |key, value| key.to_s.match(/^choice\d+/) }
或者您可以使用delete_if和修改现有的哈希,例如
delete_if
params.delete_if { |key, value| !key.to_s.match(/choice\d+/) }
或者,如果它只是键而不是您想要的值,那么您可以这样做:
params.keys.select { |key| key.to_s.match(/^choice\d+/) }
这将只给出一个键数组,例如[:choice1, :choice2, :choice3]
[:choice1, :choice2, :choice3]