首页 > 解决方案 > 根据子哈希值从哈希中选择项目

问题描述

我有来自 API 的以下 JSON 输出:

{
  "Objects": [
    {
      "FieldValues": [
        {
          "Field": {
            "Name": "Nuix Field"
          },
          "Value": "Primary Date"
        },
        {
          "Field": {
            "Name": "Field Type"
          },
          "Value": {
            "Name": "Nuix"
          }
        },
        {
          "Field": {
            "Name": "Field Category"
          },
          "Value": {
            "Name": "Generic"
          }
        }
      ]
    }
  ]
}

我希望能够选择所有Objects“字段”具有“字段类型”的“名称”并且它的“值”具有“Nuix”的“名称”。

这是我的尝试,但我觉得有更好的方法吗?

json = JSON.parse(response)
        results = []
            json["Objects"].each do |obj|
                obj["FieldValues"].each do |fv|
                    if fv["Field"]["Name"] == "Field Type" && fv["Value"]["Name"] == "Nuix"
                        results << obj
                    end
                end
            end

标签: ruby

解决方案


选项之一是不循环所有FieldValues,而仅在使用该any?方法找到预期的循环之前。
然后您可以使用方法简化代码select,该方法将创建仅包含“满意”对象的新数组。

objects_with_required_fields = json.fetch("Objects", []).select do |obj|
  obj.fetch("FieldValues", []).any? do |fv|
    name = fv.dig("Field", "Name")
    value = fv["Value"]

    name == "Field Type" && value.is_a?(Hash) && value["Name"] == "Nuix"
  end
end

推荐阅读