2016-06-23 8 views
0

私は、次のハッシュを持って言う:ルビーのハッシュでflattenを呼び出す。倒錯変態

error_hash = { 
    :base => [ 
     [0] [ 
      [0] "Address is required to activate" 
     ] 
    ] 
} 

は、これらの結果は、奇数はありますか?

[18] pry(#<Api::UsersController>)> error_hash.flatten 
[ 
    [0] :base, 
    [1] [ 
     [0] [ 
      [0] "Address is required to activate" 
     ] 
    ] 
] 
[19] pry(#<Api::UsersController>)> error_hash.flatten(1) 
[ 
    [0] :base, 
    [1] [ 
     [0] [ 
      [0] "Address is required to activate" 
     ] 
    ] 
] 
[20] pry(#<Api::UsersController>)> error_hash.flatten(2) 
[ 
    [0] :base, 
    [1] [ 
     [0] "Address is required to activate" 
    ] 
] 
[21] pry(#<Api::UsersController>)> error_hash.flatten(3) 
[ 
    [0] :base, 
    [1] "Address is required to activate" 
] 

Iは.flattenflatten(3)に等しくなっていると予想しているであろう、または換言すれば、私はevereythingが単一のアレイになるまで.flattenを再帰的に平坦化されていると予想しているであろう。

+0

@リチャード、その質問は[Array#flatten](http://ruby-doc.org/core-2.2.0/Array.html#method-i-flatten)です。これは、[Hash#flatten](http://ruby-doc.org/core-2.2.0/Hash.html#method-i-flatten)です。 –

+0

完全に平らにしたいが、入れ子の深さがわからない場合は、 'error_hash.flatten(1000000)#=> [:base、"アドレスは有効にする必要があります " '[0]'と '[1]'のラベルをすべて削除して、読者がカットアンドペーストできるようにする必要があります。 –

+0

ハッシュを平坦化することについての質問は、配列の平坦化に関係するものの複製とみなされますか?あなたが同意する場合は、投票を再開することを検討してください。 –

答えて

2

documentationに別の方法があると、フラットが再帰的に動作すると思われるのはなぜですか?

次使用して、ハッシュの機能を拡張することができます

class Hash 
    def flatten_deepest 
    self.each_with_object({}) do |(key, val), h| 
     if val.is_a? Hash 
     val.flatten_to_root.map do |hash_key, hash_val| 
      h["#{key}.#{hash_key}".to_sym] = hash_val 
     end 
     else 
     h[k] = val 
     end 
    end 
    end 
end 

をしてから実行します。

error_hash.flatten_deepest 

私はあなたのアイデアを得たと思います。

関連する問題