Создавать новые массивы из вложенных массивов на основе соответствующих индексов - PullRequest
0 голосов
/ 03 августа 2020

У меня есть массив вложенных массивов, мне нужно создать новые массивы, состоящие из элементов в соответствующих позициях индекса. Сложно объяснить, но вот с чего я начинаю и что мне нужно произвести:

arrays = [ 
  [["ab", "cd", "ef", "gh"], ["ik", "lm", "no", "pq"],
   ["rs", "tu", "vw", "xy"]],
  [["z1", "23", "45", "67"],["89", "AB", "CD", "EF"],["GH", "IJ", "KL", "MN"]]
]

goal = [
  [["ab", "ik", "rs"], ["cd", "lm", "tu"], ["ef", "no", "vw"], ["gh", "pq", "xy"]],
  [["z1", "89", "GH"], ["23", "AB", "IJ"], ["45", "CD", "KL"], ["67", "EF", "MN"]]
]

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Вы просто транспонируете внутренние массивы:

arrays.map(&:transpose)
#=> [
#     [
#       ["ab", "ik", "rs"], 
#       ["cd", "lm", "tu"], 
#       ["ef", "no", "vw"], 
#       ["gh", "pq", "xy"]
#     ], 
#     [
#       ["z1", "89", "GH"], 
#       ["23", "AB", "IJ"], 
#       ["45", "CD", "KL"], 
#       ["67", "EF", "MN"]
#     ]
#   ]
0 голосов
/ 03 августа 2020
arrays.map { |a,*b| a.zip(*b) }
  #=> [
  #     [["ab", "ik", "rs"], ["cd", "lm", "tu"], ["ef", "no", "vw"],
  #      ["gh", "pq", "xy"]],
  #     [["z1", "89", "GH"], ["23", "AB", "IJ"], ["45", "CD", "KL"],
  #      ["67", "EF", "MN"]]
  #   ] 

Это использует то, что называется Разложение массива . arrays состоит из двух элементов. Когда первая передается в блок, переменным блока a и b присваиваются следующие значения:

a, *b = arrays[0]
  #=> [["ab", "cd", "ef", "gh"], ["ik", "lm", "no", "pq"],
  #    ["rs", "tu", "vw", "xy"]] 

Мы видим, что

a #=> ["ab", "cd", "ef", "gh"] 
b #=> [["ik", "lm", "no", "pq"], ["rs", "tu", "vw", "xy"]] 

Здесь - хорошее объяснение того, как работает оператор splat (*) Ruby. Комбинация декомпозиции массива и оператора splat - мощный инструмент, который необходимо освоить каждому Rubyist. вместо этого. Обратное верно, если каждый элемент массива имеет одинаковое количество элементов. Поскольку мы сопоставляем, последнее требование применяется отдельно к array[0] и array[1].

...