为了账号安全,请及时绑定邮箱和手机立即绑定

将嵌套的哈希转换为平面哈希

/ 猿问

将嵌套的哈希转换为平面哈希

墨色风雨 2019-11-18 18:24:20

给定一个嵌套的哈希像


{

    :a => {

       :b => {:c => 1, :d => 2},

       :e => 3,

    },

    :f => 4,

}

将其转换为扁平哈希的最佳方法是什么


{

    [:a, :b, :c] => 1,

    [:a, :b, :d] => 2,

    [:a, :e] => 3,

    [:f] => 4,

}


查看完整描述

3 回答

?
富国沪深

其他方式:


def flat_hash(h,f=[],g={})

  return g.update({ f=>h }) unless h.is_a? Hash

  h.each { |k,r| flat_hash(r,f+[k],g) }

  g

end


h = { :a => { :b => { :c => 1,

                      :d => 2 },

              :e => 3 },

      :f => 4 }


flat_hash(h) #=> {[:a, :b, :c]=>1, [:a, :b, :d]=>2, [:a, :e]=>3, [:f]=>4}


查看完整回答
反对 回复 2019-11-18
?
达令说

与Adiel Mittmann的解决方案非常相似


def flat_hash(h, k = [])

  new_hash = {}

  h.each_pair do |key, val|

    if val.is_a?(Hash)

      new_hash.merge!(flat_hash(val, k + [key]))

    else

      new_hash[k + [key]] = val

    end

  end

  new_hash

end

编辑:重构的优雅。应该差不多快。


def flat_hash(hash, k = [])

  return {k => hash} unless hash.is_a?(Hash)

  hash.inject({}){ |h, v| h.merge! flat_hash(v[-1], k + [v[0]]) }

end


查看完整回答
反对 回复 2019-11-18
?
米脂

这不是给您最好的方法,而是:P


def flatten(hash)

  return {[] => hash} if !hash.is_a?(Hash)

  map = {}

  hash.each_pair do |key1, value1|

    flatten(value1).each_pair do |key2, value2|

      map[[key1] + key2] = value2

    end

  end

  return map

end

它适用于您的示例,产生以下结果:


{[:a, :b, :c]=>1, [:a, :b, :d]=>2, [:a, :e]=>3, [:f]=>4}

如果有空哈希,它可能不会产生您期望的结果。


查看完整回答
反对 回复 2019-11-18
  • 3 回答
  • 0 关注
  • 42 浏览
我要回答

相关问题推荐

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信