从深度嵌套的 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