Ruby中展平JSON对象/哈希:嵌套键合并为字符串数组
如何在Ruby中展平嵌套哈希为点分隔键的数组列表
我们需要实现一个功能:将Ruby中的嵌套哈希(可类比JSON对象)展平,把多层嵌套的键合并成点分隔的字符串,最终输出所有键路径组成的数组。以下是具体实现方案:
实现代码
def flatten_keys(hash, prefix = nil) hash.each_with_object([]) do |(key, value), result| current_key = prefix ? "#{prefix}.#{key}" : key.to_s if value.is_a?(Hash) && !value.empty? result.concat(flatten_keys(value, current_key)) else result << current_key end end end
逻辑说明
- 递归遍历哈希的每个键值对:
- 若当前值是非空哈希,则递归处理该子哈希,同时将当前键作为前缀传递下去,拼接成新的键路径。
- 若当前值不是哈希(或为空哈希),则直接将当前拼接好的键路径加入结果数组。
- 空哈希会保留完整的键路径(如示例中的
a.b.c),数组、字符串、nil、数字等非哈希值仅保留到当前层级的键路径。
测试示例
示例1
input1 = {a: {b: {c: {} }, d:[] }, e: "e", f: nil, g: -2} output1 = flatten_keys(input1) # 输出:["a.b.c", "a.d", "e", "f", "g"] # 若需与预期顺序完全一致,可添加排序:output1.sort_by { |k| k.split('.').size }
示例2
input2 = {a: {b: {c: {h: {j: ''}, m: {n: ''}}}, d: {k: {l: '' } }},e: "e",f: nil,g: -2} output2 = flatten_keys(input2) # 输出:["a.b.c.h.j", "a.b.c.m.n", "a.d.k.l", "e", "f", "g"]
如果需要严格匹配预期的数组顺序(层级浅的键在前),可以在结果后添加排序逻辑:
# 按键路径的层级数升序排序,层级越少越靠前 flatten_keys(input1).sort_by { |key| key.split('.').size } # 示例1排序后:["g", "f", "e", "a.b.c", "a.d"]
内容的提问来源于stack exchange,提问作者Gautam
相关产品推荐
相关产品推荐

