//展平JSON对象 //(希望将所有key合并为嵌套哈希中的一个字符串,并希望输出到数组列表中)

input1 = {a: {b: {c: {} }, d:[] }, e: "e", f: nil, g: -2}
input2 = {a: {b: {c: {h: {j: ''}, m: {n: ''}}}, d: {k: {l: '' } }},e: "e",f: nil,g: -2}

//以上输入的预期输出应为具有任意顺序的所有这些键的数组

output1 = ["g", "f", "e", "a.b.c", "a.d"]
output2 = ["a.b.c.h.j", "a.b.c.m.n", "a.d.k.l", "e", "f", "g"]

推荐答案

创建一个方法

def flatten_hash_keys(hash, prefix = nil)
  flat_keys = []

  hash.each do |key, value|
    current_key = prefix ? "#{prefix}.#{key}" : key.to_s

    if value.is_a?(Hash) && !value.empty?
      flat_keys.concat(flatten_hash_keys(value, current_key))
    else
      flat_keys << current_key
    end
  end

  flat_keys
end

这段代码定义了一个采用散列和可选前缀的Flatten_hash_key方法.它递归地遍历散列,将键附加到Flat_Keysarray.如果值是非空哈希,则使用新前缀递归调用该方法.否则,当前密钥将添加到数组中

input1 = {a: {b: {c: {} }, d:[] }, e: "e", f: nil, g: -2}
input2 = {a: {b: {c: {h: {j: ''}, m: {n: ''}}}, d: {k: {l: '' } }},e: "e",f: nil,g: -2}

output1 = flatten_hash_keys(input1) #["a.b.c", "a.d", "e", "f", "g"]
output2 = flatten_hash_keys(input2) #["a.b.c.h.j", "a.b.c.m.n", "a.d.k.l", "e", "f", "g"]

Ruby相关问答推荐

有没有办法把条件语句写得更干净?

定义Struct时如何指定成员的类型?

Ruby:一个方法可以返回不同类型的对象吗?

生成带有小写字母和数字的唯一随机字符串

用于 ruby​​ gems 的新 10.9 OSX 的命令行工具?

从 Time 对象获取下/上个月

如何使用 capybara + cucumber 断言 ruby​​ 中的 html 表行数

`expect`测试中的Rspec`eq`与`eql`

如果浮点组件不是 .00 sprintf/printf,则仅显示小数点

如何在没有继承方法的情况下获取类的公共方法?

格式化 Ruby 的漂亮打印

Ruby:module、require和include

在 Ruby 中计算中位数

判断字符串是否为空的Ruby方法?

Ruby 中的超级关键字

错误数量的参数(1 代表 0)在 Ruby 中是什么意思?

找不到Bundle 命令 mac

如何传递函数而不是块

向实例对象添加方法

Ruby 类继承:什么是`<<`(双倍小于)?