我有两个数组。一个Mapper和一个我的ID。
带有外部ID的我的数组:
genres_array = [12,28,16]
映射器阵列(内部ID,外部ID)
mapper = [
[1,12],
[2,18],
[3,19],
[4,28],
[5,16],
[6,90],
]
作为结果我想现在有一个新数组,只有genres_array的内部值(genres_array首先有外部值)。在这种情况下,结果将是[1,4,5]
我尝试了很多方法,但我真的不知道如何以干净的方式解决这个简单的问题。我很确定它会像
genres_array.map { |genre_id| get_internal_id_from_mapper }
PS:也可能发生在映射器中找不到ID。在我的情况下,我只想将其从数组中删除。有什么想法吗?
答案 0 :(得分:1)
您正在寻找rassoc
:
genres_array.map { |genre_id| mapper.rassoc(genre_id)[0] }
结果是
[1, 4, 5]
genres_array.map { |genre_id|
subarr = mapper.rassoc genre_id
subarr[0] if subarr
}.compact
然后输入
genres_array = [12,28,100,16]
您仍然可以获得输出
[1, 4, 5]
答案 1 :(得分: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
答案 2 :(得分:1)
另一个涉及哈希的解决方案:
Hash[mapper].invert.values_at(*genres_array)
要求不存在的值将返回nil,如果您不希望nil只是在末尾添加.compact
。