考虑嵌套哈希中可能存在的一组属性: property_selector = ['component_styles', 'styles', 'background' ,'color'] 以下嵌套哈希值是可能的: object_to_search_containing_property = { some_attr: 'blah', component_styles:
property_selector = ['component_styles', 'styles', 'background' ,'color']
以下嵌套哈希值是可能的:
object_to_search_containing_property = {
some_attr: 'blah',
component_styles: {
styles: {
background: {
color: 'fff'
}
}
}
}
object_to_search_not_containing_property = {
some_attr: 'blah',
component_styles: {
}
}
有没有办法迭代通过property_selector来搜索这些对象来检查属性嵌套的每个级别?
Ruby中有什么东西可以做类似于:
property_selector.each do |property|
object[property][next_property] ... [property.length - 1]
end
更新
抱歉,之前没有提及,但我使用的是Ruby 2.2.3版.
你是Ruby 2.3吗?试试Hash#dig:
object_to_search_containing_property.dig(*property_selector) # => "fff" object_to_search_not_containing_property.dig(*property_selector) # => nil
唯一的问题是属性选择器数组的元素是字符串,但是您使用符号键构建嵌套对象.像这样定义属性选择器数组,而不是上面的代码工作:
property_selector = [:component_styles, :styles, :background, :color]
或者,如果您无法控制如何定义该数组,则可以动态转换它:
object.dig(*property_selector.map(&:to_sym))
这是一个便携式方法:
def dig(object, *keys)
keys.each do |key|
break unless object.respond_to?(:[])
object = object[key]
end
object
end
dig(object_to_search_containing_property, *property_selector) # => "fff"
dig(object_to_search_not_containing_property, *property_selector) # => nil
关于属性选择器数组的相同警告也适用于此处.
