在Ruby中将一个数组的某些元素映射到另一个数组?

时间:2015-08-14 03:16:23

标签: arrays ruby

我有一个这样的数组:

[1,2,3,2,4,5,3,7,8]

我想将它们映射到其他元素2 => ' b',3 =>' a'

[1,'b','a','b',4,5,'a',7,8]

有哪些策略可以做到。

3 个答案:

答案 0 :(得分:8)

arr = [1,2,3,2,4,5,3,7,8]
h = { 2=>'b', 3=>'a' }

h.default_proc = ->(_,k) { k }
h.values_at(*arr)
  #=> [1, "b", "a", "b", 4, 5, "a", 7, 8] 

答案 1 :(得分:4)

使用Hash作为映射并使用Array#map获取映射的新数组:

mapping = {2 => 'b', 3 => 'a' }
[1,2,3,2,4,5,3,7,8].map { |x| mapping.fetch(x, x) }
=> [1, "b", "a", "b", 4, 5, "a", 7, 8]

答案 2 :(得分:1)

这是另一种可能的解决方案,类似于@falsetru's answer

mapping = Hash.new {|_, v| v }.merge(2 => 'b', 3 => 'a')
[1, 2, 3, 2, 4, 5, 3, 7, 8].map(&mapping.method(:[]))
# => [1, 'b', 'a', 'b', 4, 5, 'a', 7, 8]

在Ruby问题跟踪器的Feature #11262 – Make more objects behave like "Functions"中,我建议Hash es的行为类似于键到值的函数,即它们应该实现callto_proc,允许您直接将mapping作为转换函数传递给map

[1, 2, 3, 2, 4, 5, 3, 7, 8].map(&mapping)
# => [1, 'b', 'a', 'b', 4, 5, 'a', 7, 8]

直到我的建议得到实施(可能是#34;从来没有"考虑到两个月内没有人看过它),你需要这个猴子补丁才能让它发挥作用:

module HashAsFunction
  refine Hash do
    alias_method :call, :[]

    def to_proc
      method(:call).to_proc
    end
  end
end

using HashAsFunction