加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 使用字符串数组来检查哈希中是否存在嵌套属性

发布时间:2020-12-17 01:25:07 所属栏目:百科 来源:网络整理
导读:考虑嵌套哈希中可能存在的一组属性: property_selector = ['component_styles','styles','background','color'] 以下嵌套哈希值是可能的: object_to_search_containing_property = { some_attr: 'blah',component_styles: { styles: { background: { color
考虑嵌套哈希中可能存在的一组属性:

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

关于属性选择器数组的相同警告也适用于此处.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读