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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:17:10