将第一行作为下一行散列的键?

我很难弄清楚如何用第一行的关键字做出下一行散列。

我有一个这样的数组结构:

[["id", "name", "address"], [1, "James", "...."], [2, "John", "...."] ] 

成为:

 [{ id : 1, name: "James", address: "..."}, ...] 

我用了一个gem“simple_xlsx_reader”,我只提取出第一张纸。

 wb.sheets.first.row 

并从上面得到了类似的数组输出。

谢谢!

 arr = [["id", "name"], [1, "Jack"], [2, "Jill"]] [arr.first].product(arr.drop 1).map { |a| a.transpose.to_h } #=> [{"id"=>1, "name"=>"Jack"}, {"id"=>2, "name"=>"Jill"}] 

步骤:

 b = [arr.first] #=> [["id", "name"]] c = arr.drop 1 #=> [[1, "Jack"], [2, "Jill"]] d = b.product(c) #=> [[["id", "name"], [1, "Jack"]], [["id", "name"], [2, "Jill"]]] d.map { |a| a.transpose.to_h } #=> [{"id"=>1, "name"=>"Jack"}, {"id"=>2, "name"=>"Jill"}] 

d传递给map的第一个元素是:

 a = d.first [["id", "name"], [1, "Jack"]] 

块计算是:

 e = a.transpose #=> [["id", 1], ["name", "Jack"]] e.to_h #=> {"id"=>1, "name"=>"Jack"} 

这是你要找的东西:

 arr = [["id", "name", "address"], [1, "James", "...."], [2, "John", "...."] ] keys, *values = arr values.map {|vals| keys.zip(vals).to_h } 

Enumerable#zip接受两个数组(接收者和参数)并将它们“拉”到一起,产生一个元组(array)(例如:两元素数组)

 keys = [ "foo", "bar", "baz" ] values = [ 1, 2, 3 ] p keys.zip(values) # => [ [ "foo", 1 ], [ "bar", 2 ], [ "baz", 3 ] ] 

Array#to_h接受一个元组数组,并把它变成一个散列。

如果您使用的是早于2.1版本的Ruby,则需要使用Hash[ *keys.zip(vals) ]

PS如果你想要的符号键而不是string键,你会想在map前执行转换,例如:

 keys = keys.map(&:to_sym) 

或者,如果您不介意修改原始数组:

 keys.map!(&:to_sym) 

你可以尝试这个非常简单的一行,使你的工作

  arr =[["id", "name", "address"], [1, "James", "add 1"], [2, "John", "add2"] ] arr.map {|a| arr.first.zip(a).to_h unless a == arr.first }.compact