大したネタじゃないが、自分は最初結構こまったので。
例えば次のようなハッシュがあったとする。
| key | value |
|---|---|
| 太郎 | 宮城 |
| 次郎 | 青森 |
| 花子 | 沖縄 |
これは単純にhash = {"太郎" => "宮城", "次郎" => "青森","花子" => "沖縄"}みたいに書けばいいだけだが、それと別にこんなハッシュもあるとする。
| key | value |
|---|---|
| 宮城 | 400円 |
| 青森 | 700円 |
| 沖縄 | 1200円 |
各県送料がこのくらいなのかはよくわからないのでデタラメな数字なのは勘弁して欲しいが、まぁ各地の送料みたいな表のようなイメージだ。これもref = {"宮城" => 400 ,"青森" => 700 ,"沖縄" => 1200}みたいにかくとする。
これで名前と送料の組のハッシュに変換したいみたいな場合の記述が案外調べても出てこなかったので、備忘録的に。
コメントで頂いた方法
自分は一旦二次元配列になおしてもう一回ハッシュに戻すなんて面倒臭いことをやっていたが、ハッシュの値をすべて直接変更できるメソッドであるtransform_valuesを使ったほうが全然よかった。お教え頂きありがとうございます。
list = hash.transform_values{ |x| ref[x] }
p list
# { "太郎" => 400 , "次郎" => 700, "花子" => 1200 }
もしくは
hash.transform_values(&ref)
でもいいらしい。スマート!
自分でやってた方法
list = hash.to_a.each{|x| x[1] = ref[x[1]]}.to_h
p list
# { "太郎" => 400 , "次郎" => 700, "花子" => 1200 }
順番に処理したいので、一旦to_aで二次元配列になおして、順番に二番目(x[1])に、refのハッシュのバリューを入れていって、最後はハッシュになおすだけ。
シゴク単純だが、意外とこれ迷うんだよね。ていうかもっと簡単な方法あったりしそうな気がする(ありました)。