从深度嵌套的 Ruby 哈希中删除空值
Removing empty values from an deeply nested Ruby hash
我正在构建一个支持某些 FHIR 操作的医疗保健应用程序,因此使用 jsonb 将记录存储在数据库中。
现在我想从我的参数哈希中删除空值。哈希的 JSON 表示看起来像这样:
{
"id": "f134638f-b64b-4663-8295-9ebbd00a5044",
"name": [
{
"text": "Dr. Maximilian Rohleder-Kirsch",
"given": [
"Maximilian"
],
"family": "Rohleder-Kirsch",
"prefix": [
"Dr."
],
"suffix": [
""
]
}
],
"active": true,
"gender": "male",
"address": [
{
"use": "home",
"line": [
"Wilhelmstraße"
],
"type": "physical",
"district": "Aßlar",
"postalCode": "35614"
}
],
"birthDate": null,
"identifier": [
"#<AttrJson::Type::Model:0x00007f61a4059170>"
],
"resourceType": "Patient",
"deceasedBoolean": false,
"deceasedDateTime": null
}
使用 Rails 的 reject
功能,从普通的、未嵌套的散列中删除空键/值对非常容易。
问题是(FHIR 标准的原因)例如 suffix
字段包含另一个数组,根据定义它不是空白的,因为它包含一个空字符串 - 但如果是这样,整个 suffix
应从哈希中删除密钥。
知道如何做到这一点吗?
我的计划是对每个键和值进行递归迭代,并检查该值是否为数组。
尝试以下递归:
def remove_blank(hash)
hash.each do |_, value|
if value.is_a? Hash
remove_blank(value)
elsif value.is_a?(Array) && value[0].is_a?(Hash)
remove_blank(value[0])
end
end.reject! {|_, value| value.nil? || (value.is_a?(Array) && value.reject(&:empty?).empty?) }
end
我正在构建一个支持某些 FHIR 操作的医疗保健应用程序,因此使用 jsonb 将记录存储在数据库中。
现在我想从我的参数哈希中删除空值。哈希的 JSON 表示看起来像这样:
{
"id": "f134638f-b64b-4663-8295-9ebbd00a5044",
"name": [
{
"text": "Dr. Maximilian Rohleder-Kirsch",
"given": [
"Maximilian"
],
"family": "Rohleder-Kirsch",
"prefix": [
"Dr."
],
"suffix": [
""
]
}
],
"active": true,
"gender": "male",
"address": [
{
"use": "home",
"line": [
"Wilhelmstraße"
],
"type": "physical",
"district": "Aßlar",
"postalCode": "35614"
}
],
"birthDate": null,
"identifier": [
"#<AttrJson::Type::Model:0x00007f61a4059170>"
],
"resourceType": "Patient",
"deceasedBoolean": false,
"deceasedDateTime": null
}
使用 Rails 的 reject
功能,从普通的、未嵌套的散列中删除空键/值对非常容易。
问题是(FHIR 标准的原因)例如 suffix
字段包含另一个数组,根据定义它不是空白的,因为它包含一个空字符串 - 但如果是这样,整个 suffix
应从哈希中删除密钥。
知道如何做到这一点吗?
我的计划是对每个键和值进行递归迭代,并检查该值是否为数组。
尝试以下递归:
def remove_blank(hash)
hash.each do |_, value|
if value.is_a? Hash
remove_blank(value)
elsif value.is_a?(Array) && value[0].is_a?(Hash)
remove_blank(value[0])
end
end.reject! {|_, value| value.nil? || (value.is_a?(Array) && value.reject(&:empty?).empty?) }
end