考虑以下数组
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)那么,在没有元素的地方是否可以添加空字符串,并且可以执行转置,然后像我前面给出的那样创建散列呢?数组可能由许多不同长度的元素组成,但根据数组中第一个元素的大小,每个其他内部数组都必须通过插入空字符串来更改,然后我可以执行转置操作。有办法吗?
发布于 2018-07-01 10:52:40
听起来你可能想要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]]发布于 2018-07-01 20:24:33
如果希望转换数组,则数组的每个元素必须大小相同。在这里,您需要执行如下操作。
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 }发布于 2018-07-01 10:31:05
查找数组中最长的元素,并确保其他每个元素都具有相同的长度-循环,并添加maxLength - element(i).length数量的"“元素。
https://stackoverflow.com/questions/51122430
复制相似问题