使用转置函数会导致错误



考虑以下数组

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)

那么有没有可以在没有元素的地方添加空字符串并且可以执行转置,然后创建我上面给出的哈希?数组可能包含许多不同长度的元素,但根据数组中第一个元素的大小,每个其他内部数组都必须通过插入空字符串来更改,然后我可以进行转置。有什么办法吗?

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

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

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 }

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

最新更新