У меня есть два массива:
[["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]]
Мне нужно вернуть массив, равный первому, но элементы которого заменены числом во втором с тем же значением. Ожидаемый результат:
[[15, 16, 17, 18], [19, 20, 38, 39], [40, 41, 42, 43], [44, 76, 77]]
Я пробовал много циклов с такими методами, как select и map, но безуспешно.
«Я пробовал много циклов с такими методами, как select и Map, но безуспешно» — включите свой код в следующий раз. Понимание того, почему ваш подход не сработал, может оказаться более ценным, чем просить кого-то другого написать его с нуля.
Сначала преобразуйте второй список в хеш, чтобы ускорить поиск. Затем дважды вызовите карту в исходном списке и найдите значение:
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]]
Примечание. Если значение не существует в сопоставлении, в результирующем выводе вы получите ноль.
Это было прекрасно. В моем случае всегда будет соответствующее значение, поэтому нулей нет. Большое спасибо.
lists.map { |list| list.map { hash[_1] } }
можно преобразовать в lists.map { |list| hash.values_at(*list) }
Вы также можете использовать assoc
для достижения того же результата без преобразования mapping
в хеш (имея в виду, что в mapping
всегда есть соответствующие значения):
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]]
lists.map { |list| list.map { mapping.assoc(_1)[1] } }
# => [[15, 16, 17, 18], [19, 20, 38, 39], [40, 41, 42, 43], [44, 76, 77]]
Пожалуйста, добавьте к вопросу последний подход, который вы пробовали.