首页 > 解决方案 > 从此数组创建哈希

问题描述

我有一个这样的数组

[["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"] 并且将在运行时间。

标签: ruby

解决方案


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] }

推荐阅读