Мне нужно заменить хеш-ключ внутри массива значениями из ах'аш - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть такой массив

arr = [["ContactCreate", "Test1"], [nil, nil], ["ROW1", "one"], 
       ["ROW2", "four"], ["ROW3", "seven"], ["ROW4", "Ten"],
       ["ROW5", "thirteen"]]

и такой хэш

h = {"ROW1"=>["id=xxx", "TypeAndWait"], "ROW2"=>["id=xxx", "TypeAndWait"],
     "ROW3"=>["id=yyy", "Select"], "ROW4"=>["id=zzz", "SelectAndWait"],
     "ROW5"=>["id=aaa", "Check"]}

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

[["ContactCreate", "Test1"], [nil, nil], [["id=xxx", "TypeAndWait"], "one"],
 [["id=xxx", "TypeAndWait"], "four"], [["id=yyy", "Select"], "seven"],
 [["id=zzz", "SelectAndWait"], "Ten"], [["id=aaa", "Check"], "thirteen"]]

Например, "ROW1" в третьем подмассиве следует заменить на h["ROW1"].

Есть ли простой способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018
h.default_proc = Proc.new { |h,k| k }
arr.map { |e1,e2| [h[e1], e2] }

Этот подход также можно использовать следующим образом.

arr = [["ContactCreate", "Test1", "Test2"], ["ROW1", nil], [1, "ROW2", "four"]]

arr.map { |a| a.map { |e| h[e] } }
  #=> [["ContactCreate", "Test1", "Test2"], [["id=xxx", "TypeAndWait"], nil],
  #    [1, ["id=xxx", "TypeAndWait"], "four"]]

По умолчанию процедура просто заставляет h[k] возвращать k, если h не имеет ключа k.См. Hash # default_proc = .

Если кто-то не хочет изменять h, прикрепляя процесс по умолчанию, можно прикрепить процесс по умолчанию к h.dup и использовать dup на местеh.

0 голосов
/ 30 сентября 2018

Это должно работать (arr это ваш массив, h это ваш хеш)

arr.map do |x, y|
  [h[x] || x, y]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...