将包含数组的哈希键拆分到另一个键

时间:2016-07-02 09:08:40

标签: arrays ruby hash key

我的ruby脚本有问题。我不知道如何转换哈希

g = { ["name1", "name2"] => [{ "email" => "adam@adam.pl" }], 
      ["name3", "name4"] => [{ "email" => "ewa@ewa.pl" }], 
      ["name5", "name6", "name7", "name8"] => [{ "email" => "ala@ala.pl" }] }

到哈希:

x = { "name1" => [{ "email" => "adam@adam.pl" }],
      "name2" => [{ "email" => "adam@adam.pl" }],
      "name3" => [{ "email" => "ewa@ewa.pl" }],
      "name4" => [{ "email" => "ewa@ewa.pl" }],
      "name5" => [{ "email" => "ala@ala.pl" }],
      "name6" => [{ "email" => "ala@ala.pl" }],
      "name7" => [{ "email" => "ala@ala.pl" }],
      "name8" => [{ "email" => "ala@ala.pl" }] }

我需要拆分钥匙,例如["name1", "name2"]并将其作为其值"name1" => [{ "email" => "adam@adam.pl" }], "name2" => [{ "email" => "adam@adam.pl" }]的键。

你能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

这是你可以尝试这样的结果来获得像

这样的结果
h = Hash[*g.map { |keys, value| keys.map {|key| [key,value]} }.flatten]

这给了我们一个哈希

{ "name1" => { "email" => "adam@adam.pl" },
  "name2" => { "email" => "adam@adam.pl" },
  "name3" => { "email" => "ewa@ewa.pl" },
  "name4" => { "email" => "ewa@ewa.pl" },
  "name5" => { "email" => "ala@ala.pl" },
  "name6" => { "email" => "ala@ala.pl" },
  "name7" => { "email" => "ala@ala.pl" },
  "name8" => { "email" => "ala@ala.pl" } } 

在上面的值中,哈希格式也不在数组中。如果不需要,那么这可以为你工作

答案 1 :(得分:0)

试试这个:

g.each_with_object({}) do |(k, v), obj|
  k.each { |e| obj[e] = v }
end

与其他解决方案的性能比较:

#                                           user     system      total        real
# each_with_object...
# separate_keys1(1_000_000 times):      9.765000   0.000000   9.765000 (  9.908535)
# Hash[]...
# separate_keys2(1_000_000 times):     16.505000   0.016000  16.521000 ( 16.725911)
相关问题