代码之家  ›  专栏  ›  技术社区  ›  Rajagopalan

使用转置函数会导致错误

  •  2
  • Rajagopalan  · 技术社区  · 6 年前

    考虑以下数组

    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 回复  |  直到 6 年前
        1
  •  1
  •   matthewd    6 年前

    听起来你可能想要 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]]
    
        2
  •  1
  •   Cary Swoveland    6 年前

    如果要转置数组数组,则数组的每个元素必须具有相同的大小。在这里你需要做如下的事情。

    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 }
    
        3
  •  0
  •   JoeDortman    6 年前

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