簡體   English   中英

在Ruby中將一個數組的某些元素映射到另一個數組?

[英]Map certain elements of one array to another array in Ruby?

我有這樣一個數組:

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

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

[1,'b','a','b',4,5,'a',7,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] 

使用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]

這是另一種可能的解決方案,類似於@fattru的答案

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]

功能#11262中 - 讓更多的對象在Ruby問題跟蹤器上表現得像“函數” ,我建議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]

直到我的建議得到實施(這可能是“永遠不會”,考慮到兩個月內沒有人看過它),你需要這個猴子補丁來讓它工作:

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

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

using HashAsFunction

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM