4

ネストされたハッシュを配列にフラット化したいと思います。例えば:

a = {'1'=>{'2'=>{'5'=>{},'6'=>{'8'=>{}}}},'3'=>{},'4'=>{'7'=>{}}}

flatten_nested_hash(a) の結果は次のようになります。

["1", "2", "5", "6", "8", "3", "4", "7"]

最後に、再帰関数を書きましたが、もっと簡単で非再帰的な方法が必要だと感じています。

私の関数は次のようになります。

  def flatten_nested_hash(categories)
    categories.map do |k,v|
      if v == {} 
        k
      else
        [k,flatten_nested_hash(v)]
      end
    end.flatten
  end
4

5 に答える 5

0
module Flattener
  def deep_flatten
    flatten.map do |item|
      case item
      when Hash, Array
        item.deep_flatten
      else
        item
      end
    end.flatten
  end
end

class Hash

  include Flattener

end

class Array

  include Flattener

end
于 2016-03-12T20:39:21.620 に答える
0

これは (明示的に) 再帰的ではなく、非負の整数キーに対してのみ機能します。

a.to_s.scan(/\d+/).map(&:to_i)   # [1, 2, 5, 6, 8, 3, 4, 7]

:-)

于 2013-07-12T11:39:23.393 に答える