如何在嵌套哈希中深度查找指定键值并避免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
代码逻辑说明
- 参数处理:支持可变数量的键参数,自动转为键链数组
- 哈希处理:
- 先检查当前哈希是否包含目标键,若包含则递归查找剩余键
- 若当前哈希不包含目标键,遍历所有值继续深层查找
- 数组处理:遍历数组中的每个元素,对每个元素递归执行查找逻辑
- 终止条件:当数据为
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
相关产品推荐
相关产品推荐

