将第一行作为下一行散列的键?
我很难弄清楚如何用第一行的关键字做出下一行散列。
我有一个这样的数组结构:
[["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