从该数组创建哈希

时间:2018-12-20 11:17:48

标签: ruby

我有一个像这样的数组

[["DataSetId", "DataSet-1", "DataSet-1"], ["Did", "DataSet-1", "DataSet-2"], ["Company Name", "Company1", "Company2"]]

我想要如下所示的哈希数组

[{"DataSetId"=>"DataSet-1","Did"=>"DataSet-1","Company Name"=>"Company1"},{"DataSetId"=>"DataSet-1","Did"=>"DataSet-2","Company Name"=>"Company2"}]

第一个元素应该是键,数组中的其余元素是值。例如,这里的值可能会增加,键是"Did",而值是"DataSet-1", "DataSet-2"

这里具有三个元素的数组是动态的,它将包含更多元素,例如[“ Did”,“ DataSet-1”,“ DataSet-2”,“ DataSet-3”,“ DataSet-4”],在运行时确定。

1 个答案:

答案 0 :(得分:2)

hash.
  map { |a| [a.first].product(a[1..-1]) }.
  reduce(&:zip).
  map { |a| a.flatten.each_slice(2).each_with_object({}) { |(k, v), h| h[k] = v } }
#⇒ [{"DataSetId"=>"DataSet-1", "Did"=>"DataSet-1", "Company Name"=>"Company1"},
#   {"DataSetId"=>"DataSet-1", "Did"=>"DataSet-2", "Company Name"=>"Company2"}]

我很确定最后一个转换可能会以一种更优雅的方式完成,但是我不知道该怎么做。

UPD 想通了:

hash.
  map { |a| [a.first].product(a[1..-1]) }.
  reduce(&:zip).
  map { |a| Hash[*a.flatten] }