如果哈希值是字符串,Ruby/Rails返回哈希元素



在我的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"}}}}

最新更新