首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归地将哈希转换为OpenStruct

递归地将哈希转换为OpenStruct
EN

Stack Overflow用户
提问于 2017-03-01 06:02:42
回答 5查看 13.8K关注 0票数 24

假设我有这个散列:

代码语言:javascript
复制
h = { a: 'a', b: 'b', c: { d: 'd', e: 'e'} }

然后我将其转换为OpenStruct:

代码语言:javascript
复制
o = OpenStruct.new(h)
 => #"d", :e=>"e"}> 
o.a
 => "a" 
o.b
 => "b" 
o.c
 => {:d=>"d", :e=>"e"} 
2.1.2 :006 > o.c.d
NoMethodError: undefined method `d' for {:d=>"d", :e=>"e"}:Hash

我希望所有嵌套的键也都是方法。这样我就可以访问d因此:

代码语言:javascript
复制
o.c.d
=> "d"

我怎样才能做到这一点呢?

EN

回答 5

Stack Overflow用户

发布于 2017-08-24 10:23:33

你可以用猴子补丁Hash

代码语言:javascript
复制
class Hash
  def to_o
    JSON.parse to_json, object_class: OpenStruct
  end
end

然后你可以说

代码语言:javascript
复制
h = { a: 'a', b: 'b', c: { d: 'd', e: 'e'} }
o = h.to_o
o.c.d # => 'd'

请参见Convert a complex nested hash to an object

票数 36
EN

Stack Overflow用户

发布于 2017-03-01 06:11:54

我想出了这个解决方案:

代码语言:javascript
复制
h = { a: 'a', b: 'b', c: { d: 'd', e: 'e'} }
json = h.to_json
=> "{\"a\":\"a\",\"b\":\"b\",\"c\":{\"d\":\"d\",\"e\":\"e\"}}" 
object = JSON.parse(json, object_class:OpenStruct)
object.c.d
 => "d"

因此,为了让它正常工作,我必须执行一个额外的步骤:将其转换为json。

票数 27
EN

Stack Overflow用户

发布于 2019-07-30 06:29:54

下面是一个递归解决方案,可以避免将散列转换为json:

代码语言:javascript
复制
def to_o(obj)
  if obj.is_a?(Hash)
    return OpenStruct.new(obj.map{ |key, val| [ key, to_o(val) ] }.to_h)
  elsif obj.is_a?(Array)
    return obj.map{ |o| to_o(o) }
  else # Assumed to be a primitive value
    return obj
  end
end
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42519557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档