Работа с функциями транспонирования приводит к ошибке - PullRequest
0 голосов
/ 01 июля 2018

рассмотрим следующий массив

arr = [["Locator", "Test1", "string1","string2","string3","string4"],
       ["$LogicalName", "Create Individual Contact","value1","value2"]]

Желаемый результат:

[Test1=>{"string1"=>"value1","string2"=>"value2","string3"=>"","string4"=>""}]

Когда я делаю транспонирование, я получаю сообщение об ошибке, говоря, что второй элемент массива не является длиной первого элемента в массиве,

Uncaught exception: element size differs (2 should be 4)

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

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

Звучит так, как вы, возможно, захотите Enumerable#zip:

headers, *data_rows = input_data
headers.zip(*data_rows)
# => [["Locator", "$LogicalName"], ["Test1", "Create Individual Contact"],
#     ["string1", "value1"], ["string2", "value2"], ["string3", nil], ["string4", nil]]
0 голосов
/ 01 июля 2018

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

arr = [["Locator", "Test1", "string1","string2","string3","string4"],
       ["$LogicalName", "Create Individual Contact","value1","value2"]]

keys, vals = arr
  #=> [["Locator", "Test1", "string1", "string2", "string3", "string4"],
  #    ["$LogicalName", "Create Individual Contact", "value1", "value2"]]
idx = keys.index("Test1") + 1
  #=> 2

{ "Test1" => [keys[idx..-1],
              vals[idx..-1].
                concat(['']*(keys.size - vals.size))].
                transpose.
                to_h }
  #=> {"Test1"=>{"string1"=>"value1", "string2"=>"value2", "string3"=>"", "string4"=>""}}

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

Шаги следующие. Примечание keys.size #=> 6 и vals.size #=> 4.

a = vals[idx..-1]
  #=> vals[2..-1]
  #=> ["value1", "value2"]
b = [""]*(keys.size - vals.size)
  #=> [""]*(4 - 2)
  #=> ["", ""]
c = a.concat(b)
  #=> ["value1", "value2", "", ""]
d = keys[idx..-1]
  #=> ["string1", "string2", "string3", "string4"]
e = [d, c].transpose
  #=> [["string1", "value1"], ["string2", "value2"], ["string3", ""], ["string4", ""]]
f = e.to_h
  #=> {"string1"=>"value1", "string2"=>"value2", "string3"=>"", "string4"=>""}
f = e.to_h
  #=> { "Test1" => f }
0 голосов
/ 01 июля 2018

Найдите самый длинный элемент в вашем массиве и убедитесь, что все остальные элементы имеют одинаковую длину - цикл и добавьте maxLength - element(i).length количество "" элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...