Ruby: ハッシュキーをフィルタリングする最も簡単な方法は? 質問する

Ruby: ハッシュキーをフィルタリングする最も簡単な方法は? 質問する

次のようなハッシュがあります:

params = { :irrelevant => "A String",
           :choice1 => "Oh look, another one",
           :choice2 => "Even more strings",
           :choice3 => "But wait",
           :irrelevant2 => "The last string" }

そして、choice+int ではないすべてのキーを拒否する簡単な方法が欲しいです。それは choice1 かもしれないし、choice1 から choice10 かもしれません。様々です。

choice という単語と、その後に続く数字だけでキーを特定するにはどうすればよいですか?

ボーナス:

ハッシュをタブ (\t) を区切り文字として文字列に変換します。私はこれを実行しましたが、数行のコードが必要でした。通常、熟練の Rubicians は 1 行かそこらでこれを実行できます。

ベストアンサー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]

おすすめ記事