他の 2 つに基づいて配列を生成

概要

2 つの配列があります。

[["106373", "106374", "106375", "106376"], ["106377", "106378", "220183", "220184"], ["220185", "220186", "220187", "220188"], ["220189", "220190", "106379"]]
[["106373", 15],
 ["106374", 16],
 ["106375", 17],
 ["106376", 18],
 ["106377", 19],
 ["106378", 20],
 ["106379", 77],
 ["220183", 38],
 ["220184", 39],
 ["220185", 40],
 ["220186", 41],
 ["220187", 42],
 ["220188", 43],
 ["220189", 44],
 ["220190", 76]]

私が必要とするのは、最初の配列と等しいが、項目が同じ値を持つ 2 番目の数値で置き換えられた配列を返すことです。期待される結果:

[[15, 16, 17, 18], [19, 20, 38, 39], [40, 41, 42, 43], [44, 76, 77]]

select や map などのメソッドを使用して多くのループを試しましたが、成功しませんでした。

解決策

まず、検索を高速化するために 2 番目のリストをハッシュに変換します。次に、元のリストで Map を 2 回呼び出し、値を検索します。

lists = [["106373", "106374", "106375", "106376"], ["106377", "106378", "220183", "220184"], ["220185", "220186", "220187", "220188"], ["220189", "220190", "106379"]]

mapping = [
  ["106373", 15],
  ["106374", 16],
  ["106375", 17],
  ["106376", 18],
  ["106377", 19],
  ["106378", 20],
  ["106379", 77],
  ["220183", 38],
  ["220184", 39],
  ["220185", 40],
  ["220186", 41],
  ["220187", 42],
  ["220188", 43],
  ["220189", 44],
  ["220190", 76]
]

hash = mapping.to_h

p lists.map { |list| list.map { hash[_1] } }

出力:

[[15, 16, 17, 18], [19, 20, 38, 39], [40, 41, 42, 43], [44, 76, 77]]

注: 値がマッピングに存在しない場合、結果の出力では nil が返されます。