2

我有两个数组。一个映射器和一个带有我的 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 的情况。在那种情况下,我只想将它从数组中删除。任何想法?

4

3 回答 3

1

如果找不到外部ID,另一种不会引发异常的方法:

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
于 2013-11-08T22:41:47.703 回答
1

另一个涉及哈希的解决方案:

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

请求不存在的值将返回 nil,如果您不希望 nil.compact在最后添加。

于 2013-11-09T09:41:56.917 回答
1

您正在寻找rassoc

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

这导致

[1, 4, 5]

编辑:只需阅读 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]
于 2013-11-08T22:38:55.110 回答