使用移调函数会导致错误

时间:2018-07-01 10:24:03

标签: arrays ruby

考虑以下数组

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 :(得分:1)

听起来您可能想要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]]

答案 1 :(得分:1)

如果要转置数组数组,则数组的每个元素必须具有相同的大小。在这里,您需要执行以下操作。

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"=>""}}

定义变量keysvals并不是绝对必要的,但这避免了多次创建这些数组的需要。我认为它的阅读效果也更好。

步骤如下。请注意keys.size #=> 6vals.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 }

答案 2 :(得分:0)

找到数组中最长的元素,并确保其他所有元素都具有相同的长度-循环并添加maxLength - element(i).length数量的“”元素。