gpt4 book ai didi

ruby - 使用字符串数组检查散列中是否存在嵌套属性

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:15 25 4
gpt4 key购买 nike

考虑嵌套散列中可能存在的一组属性:

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

关于属性选择器数组的警告同样适用于此。

关于ruby - 使用字符串数组检查散列中是否存在嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50050506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com