Ruby 哈希值是数组,需要转换为字符串



我有一个整数哈希作为键,字符串数组作为值。 我需要将其转换为新的哈希,该哈希值将这种关系与原始哈希值中的字符串数组中的每个项目反转为新哈希中的键,并且每个原始键成为关联值。 例如:

original = {1 => ['a', 'b', 'c'], 2 => ['g', 'm', 'z']}
new_hash = {'a' => 1, 'b' => 1, 'c' => 1, 'g' => 2, 'm' => 2, 'z' => 2}

我正在努力从原始数组值中提取项目。 这很容易做到

original.each { |k, v| new_hash[v] = k }

但这会将原始数组保留为新键。 我试过做类似的事情

original.each { |k, v| new_hash[v.each { |i| i }] = k }

但出于某种原因,这也返回原始数组。

另一个,通过Array#product

original.flat_map { |k, v| v.product([k]) }.to_h
#=> {"a"=>1, "b"=>1, "c"=>1, "g"=>2, "m"=>2, "z"=>2}
original.flat_map { |k, vs| vs.map { |v| {v => k} } }.reduce(&:merge)

下面的代码片段会给出你想要的,但让我考虑一个更具可读性和优雅的解决方案。

newhash = {}
original.each do |k,v|
  v.each do |v2|
    newhash[v2] = k
  end
end
#=> {1=>["a", "b", "c"], 2=>["g", "m", "z"]}
newhash
#=> {"a"=>1, "b"=>1, "c"=>1, "g"=>2, "m"=>2, "z"=>2}

你的方法很接近。将新的键/值对分配给 newHash 时,您必须迭代 values 数组中的每个元素

newHash = {}
original.each { |k, v| v.each {|i| newHash[i] = k}}
original.map { |number, ary| Hash[ary.map { |char| [char, number] }] }.reduce(&:merge)

最新更新