2013-11-08 5 views
2

У меня есть два массива. Один Mapper и один с моим идентификатором.Поиск двухмерного массива другим массивом

Мой массив с внешними идентификаторами:

genres_array = [12,28,16]

картограф Array (Internal-ID, External-ID)

mapper = [ 
    [1,12], 
    [2,18], 
    [3,19], 
    [4,28], 
    [5,16], 
    [6,90], 
] 

Как результат я хотел бы иметь теперь новый массив , только с внутренними значениями genres_array (сначала genres_array имел внешние значения). В этом случае результат будет [1,4,5]

Я пробовал много способов, но я действительно не знаю, как решить эту простую проблему чистым способом. Im уверен, что это будет что-то вроде

genres_array.map { |genre_id| get_internal_id_from_mapper }

PS: Это может также случиться, что идентификатор не будет найден в картографа. В этом случае я просто хочу удалить его из массива. Есть идеи?

ответ

1

Вы ищете rassoc:

genres_array.map { |genre_id| mapper.rassoc(genre_id)[0] } 

Какие результаты в

[1, 4, 5] 

EDIT: Просто прочитайте PS - попробовать что-то вроде этого:

genres_array.map { |genre_id| 
    subarr = mapper.rassoc genre_id 
    subarr[0] if subarr 
}.compact 

Затем для ввода

genres_array = [12,28,100,16] 

Вы бы еще получить выход

[1, 4, 5] 
+0

Спасибо, что это очень чистое решение! Только одна проблема: если у меня есть id в моем genres_array, который не существует в массиве mapper, я получаю это исключение: 'NoMethodError: undefined method' [] 'для nil: NilClass' –

+0

@PhilipGiuliani Да, уже отредактированный;) – Doorknob

+0

Относитесь приятно спасибо :) легче, чем я думал! –

1

Другой способ, который не будет бросать исключение, если внешний идентификатор не найден:

genres_array = [12,28,16] 

mapper = [ 
    [1,12], 
    [2,18], 
    [3,19], 
    [4,28], 
    [5,16], 
    [6,90], 
] 

internal_ids = genres_array.map do |genre_id| 
    element = mapper.detect { |m| m[1] == genre_id } 
    element ? element[0] : nil 
end.compact 
1

Другое решение с участием хеш:

Hash[mapper].invert.values_at(*genres_array) 

Задать вопрос который не существует, будет возвращать нуль, если вы не хотите, чтобы ноль просто добавлял .compact в конец.

Смежные вопросы