小编典典

Ruby:过滤哈希键的最简单方法?

all

我有一个看起来像这样的哈希:

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 大师可以在一行左右的时间内完成。


阅读 79

收藏
2022-05-17

共1个答案

小编典典

编辑为原始答案 :即使这是答案(截至本评论时)是所选答案,但此答案的原始版本已过时。

我在这里添加了一个更新,以帮助其他人避免像我一样被这个答案所迷惑。

正如其他答案所提到的,Ruby >= 2.5 添加了Hash#slice以前仅在 Rails 中可用的方法。

例子:

> { one: 1, two: 2, three: 3 }.slice(:one, :two)
=> {:one=>1, :two=>2}

编辑结束。 下面是最初的答案,我想如果你在没有 Rails 的情况下使用 Ruby < 2.5,它会很有用,尽管我认为这种情况在这一点上相当罕见。


如果您使用的是 Ruby,则可以使用该select方法。您需要将键从符号转换为字符串以进行正则表达式匹配。这将为您提供一个仅包含选项的新哈希。

choices = params.select { |key, value| key.to_s.match(/^choice\d+/) }

或者您可以使用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]

2022-05-17