【问题标题】:Removing empty values from an deeply nested Ruby hash从深度嵌套的 Ruby 哈希中删除空值
【发布时间】:2020-12-19 16:52:26
【问题描述】:

我正在构建一个医疗保健应用程序,它支持一些 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 键来自哈希。

你知道怎么做吗?

我的计划是对每个键和值进行递归迭代,并检查该值是否为数组。

【问题讨论】:

  • 您能否更准确地定义“空值”的含义?比如suffix: ['']这对的值是一个包含一个元素的数组,显然不为空。此外,在给出示例时,显示所需的结果(作为 Ruby 对象)总是有帮助的。
  • 我会把你的沉默当作“不”。

标签: ruby-on-rails ruby ruby-hash


【解决方案1】:

使用 recussion 尝试以下操作:

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

【讨论】:

  • remove_blank(a: '') #=&gt; nil。这是故意的吗?
  • 小心这取决于您期望它的嵌套深度!
猜你喜欢
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 2016-03-02
  • 2021-04-20
相关资源
最近更新 更多