2016-07-02 8 views
0

私のルビースクリプトに問題があります。配列を含むハッシュキーを別のキーに分割する

x = { "name1" => [{ "email" => "[email protected]" }], 
     "name2" => [{ "email" => "[email protected]" }], 
     "name3" => [{ "email" => "[email protected]" }], 
     "name4" => [{ "email" => "[email protected]" }], 
     "name5" => [{ "email" => "[email protected]" }], 
     "name6" => [{ "email" => "[email protected]" }], 
     "name7" => [{ "email" => "[email protected]" }], 
     "name8" => [{ "email" => "[email protected]" }] } 

は、私は、例えば、キーを分割する必要があります。私は、ハッシュにハッシュ

g = { ["name1", "name2"] => [{ "email" => "[email protected]" }], 
     ["name3", "name4"] => [{ "email" => "[email protected]" }], 
     ["name5", "name6", "name7", "name8"] => [{ "email" => "[email protected]" }] } 

を変換する方法がわかりません["name1", "name2"]を入力し、値"name1" => [{ "email" => "[email protected]" }], "name2" => [{ "email" => "[email protected]" }]のキーとして入力します。

これを手伝ってもらえますか?

+0

何か試しましたか? –

+0

はい、私は要素のnumebrでキーの配列を分割しようとしましたが、すべての新しいキーの値として値を入れる方法がわかりません。 –

答えて

0

この試してみてください。これはあなたが私たちを与える

h = Hash[*g.map { |keys, value| keys.map {|key| [key,value]} }.flatten] 

のような結果を得るためにそれのような何かを試すことができている

#           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) 
3

:他のソリューションとの

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

性能比較をハッシュ

{ "name1" => { "email" => "[email protected]" }, 
    "name2" => { "email" => "[email protected]" }, 
    "name3" => { "email" => "[email protected]" }, 
    "name4" => { "email" => "[email protected]" }, 
    "name5" => { "email" => "[email protected]" }, 
    "name6" => { "email" => "[email protected]" }, 
    "name7" => { "email" => "[email protected]" }, 
    "name8" => { "email" => "[email protected]" } } 

上記の値は配列ではないハッシュ形式です。その必要がない場合、これはあなたのために働くことができます

関連する問題