You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在嵌套哈希中深度查找指定键值并避免NilClass错误?

实现递归方法深度查找嵌套哈希/数组中的键值对

在处理多层嵌套的哈希和数组结构时,普通的has_key?只能检查顶层键,手动加present?判断又容易遗漏分支导致undefined method []' for nil:NilClass错误。下面是一个递归实现的方法,能全局遍历嵌套结构,按给定的键链查找对应值,找不到则返回nil。

实现代码

module TestHelper
  def self.deep_find_value_w_key(data, *keys)
    return nil if data.nil? || keys.empty?

    current_key = keys.first
    remaining_keys = keys.drop(1)

    case data
    when Hash
      if data.key?(current_key)
        if remaining_keys.empty?
          data[current_key]
        else
          deep_find_value_w_key(data[current_key], *remaining_keys)
        end
      else
        data.values.each do |value|
          result = deep_find_value_w_key(value, *keys)
          return result unless result.nil?
        end
        nil
      end
    when Array
      data.each do |element|
        result = deep_find_value_w_key(element, *keys)
        return result unless result.nil?
      end
      nil
    else
      nil
    end
  end
end

代码逻辑说明

  1. 参数处理:支持可变数量的键参数,自动转为键链数组
  2. 哈希处理:
    • 先检查当前哈希是否包含目标键,若包含则递归查找剩余键
    • 若当前哈希不包含目标键,遍历所有值继续深层查找
  3. 数组处理:遍历数组中的每个元素,对每个元素递归执行查找逻辑
  4. 终止条件:当数据为nil、键链为空,或遍历完所有结构都未找到时,返回nil

使用示例

针对你提供的示例哈希:

my_hash = {
  "key1": "value1",
  "key2": {
    "key3": "value3",
    "key4": [{"key5": "value5"}, {"key6": "value6"}]
  },
  "key7": [
    {
      "key8": "value8",
      "key9": {
        "key10": "value10",
        "key11": ["value11"],
        "key12": ["value12"]
      }
    },
    {
      "key13": "value13",
      "key14": [
        {"key15": "value15", "key16": "value16"},
        {"key17": "value17", "key18": {"start": "2022-02-03", "end": "2025-02-03"}},
        {"key19": "value19", "key20": {"key21": [{"key22": "value22", "key23": "value23"}]}}
      ]
    }
  ]
}

# 查找key9 -> key11对应的值
puts TestHelper.deep_find_value_w_key(my_hash, "key9", "key11")
# 输出: ["value11"]

# 查找不存在的键链,返回nil
puts TestHelper.deep_find_value_w_key(my_hash, "key99", "key100").inspect
# 输出: nil

如果需要直接返回数组中的单个元素(比如你的预期是"value11"而非数组),可以修改方法中返回值的逻辑:

# 修改哈希分支的返回逻辑
if remaining_keys.empty?
  value = data[current_key]
  value.is_a?(Array) ? value.first : value
else
  deep_find_value_w_key(data[current_key], *remaining_keys)
end

内容的提问来源于stack exchange,提问作者h3lt3r-sk3lt3r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:01:48