1. ホーム
  2. ルビー

[解決済み】Ruby: ハッシュキーのフィルタリングを行う最も簡単な方法とは?

2022-04-05 10:18:55

質問

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

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という単語と、その後に1桁または2桁の数字があるだけのキーを単一化するにはどうすればよいですか?

ボーナスです。

ハッシュをタブ(☑)をデリミターとする文字列にする。私はこれをやりましたが、数行のコードが必要でした。Rubyの達人なら1行程度でできるはずです。

どのように解決するのですか?

元の答えを編集する : この回答は(このコメントの時点では)選択された回答であるにもかかわらず、この回答のオリジナルバージョンは古くなっています。

他の人が私のようにこの回答から脱線しないように、ここに更新を追加しています。

他の回答にもあるように、Ruby >=2.5から Hash#slice メソッドは、以前は Rails でのみ利用可能でした。

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

編集を終了します。 以下は、Ruby < 2.5 で Rails を使っていない場合に役立つと思われるオリジナルの回答ですが、現時点ではこのケースはかなり珍しいと思われます。


Rubyを使っている場合は select メソッドを使用します。正規表現によるマッチングを行うために、キーをSymbolからStringに変換する必要があります。これで、選択肢だけを含む新しいHashが得られます。

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

を使用することもできます。 delete_if を作成し、既存のHashを修正します。

params.delete_if { |key, value| !key.to_s.match(/choice\d+/) }

または、キーだけで、値が必要でない場合は、そうすることができます。

params.keys.select { |key| key.to_s.match(/^choice\d+/) }

で、これは単なるキーの配列になります。 [:choice1, :choice2, :choice3]