在我的Rails 6和Ruby 2.7应用程序中,我试图只返回这些哈希元素,其中哈希值是字符串。问题是这个散列中有其他散列(所以它是散列的散列)。像下图:
hash = {
language: 'EN',
details: {
resultRanges: {
book: {
title: 'Dunder Mifflin',
available: true,
rank: -1.0,
label: 'gray',
},
},
},
}
从这个散列中我应该得到这样的结果:
{
language: 'EN',
details: {
resultRanges: {
book: {
title: 'Dunder Mifflin',
label: 'gray',
},
},
},
}
我不知道怎么做。如果我使用hash.keys
,我将得到[:language, :details]
,所以我不能使用hash.select { |k, v| v.is_a?(String) }
这样的东西,因为它只会给我第一个哈希键-{:language=>"EN"}
。
你需要的是一个递归,即一个函数,调用自己:
def filter_hash(hash)
hash.each_with_object({}) do |(key, value), acc|
acc[key] = value if value.is_a?(String)
acc[key] = filter_hash(value) if value.is_a?(Hash)
end
end
这个函数检查你的哈希值是否为String
,然后保存它,如果是Hash
,它用嵌套的哈希值调用自己
您正在寻找递归函数
def recursively_delete(hash)
hash.each do |k, v|
if v.is_a?(Hash)
recursively_delete(v)
elsif !v.is_a?(String)
hash.delete(k)
end
end
end
recursively_delete(hash)
p hash
=> {:language=>"EN", :details=> {:resultRanges=>{:book=>{:title=>"Dunder Mifflin", :label=>"gray"}}}}