Ruby:如何创建嵌套的键/值关系

Ruby:如何创建嵌套的键/值关系,ruby,nested-loops,key-value,Ruby,Nested Loops,Key Value,我正在尝试创建一个函数,输出JSON所有条目的键和值,如下所述,以便使用它发送类似以下内容的信息: key = "id", value = 1 key = "mem/stat1", value = 10 key = "more_stats/extra_stats/stat7", value = 5 JSON示例: my_json = { "id": 1, "system_name": "System_1", "mem" : { "

我正在尝试创建一个函数,输出JSON所有条目的键和值,如下所述,以便使用它发送类似以下内容的信息:

key = "id", value = 1
key = "mem/stat1", value = 10
key = "more_stats/extra_stats/stat7", value = 5
JSON示例:

my_json =
    {
      "id": 1,
      "system_name": "System_1",
      "mem" : {
          "stat1" : 10,
          "stat2" : 1056,
          "stat3" : 10563,
      },
     "other_stats" : {
        "stat4" : 1,
        "stat5" : 2,
        "stat6" : 3,
      }, 
      "more_stats" : {
        "name" : "jdlfjsdlfjs",
        "os" : "fjsalfjsl",
        "error_count": 3
        "extra_stats" : {
            "stat7" : 5,
            "stat8" : 6,
        },
      }
    }
我从这个问题()中找到了一个很有帮助的答案,但即使做了一些修改,它也无法按照我的意愿工作:

def hashkeys(json, keys = [], result = [])
      if json.is_a?(Hash)
        json.each do |key, value|
          hashkeys(value, keys + [key], result)
        end
      else
        result << keys
      end
      result.join("/")
    end
理想情况下,我想要的东西能够接收我的json:

find_nested_key_value(my_json)
   some logic loop involving key and value:
      if more logic needed
         another_logic_loop_for_more_nested_info
      else
         send_info(final_key, final_value)
      end
   end
 end
因此,如果
final_key=“mem/stat1”
那么
final_值=10
,那么下一次迭代将是
final_key=“mem/stat2”
final_值=1056
,依此类推


我如何做到这一点?这是一种递归方法,它将创建一个“扁平散列”,一个没有嵌套的散列,其中键是由斜线分隔的嵌套键

 def flatten_hash(hash, result = {}, prefix = nil)
   hash.each do |k,v|
     if v.is_a? Hash
       flatten_hash(v, result, [prefix, k].compact.join('/'))
     else
       result[[prefix, k].compact.join('/')] = v
     end
   end
   result
 end

my_hash = {'id': 1, 'system_name': 'Sysem_1', 'mem': {'stat1': 10, 'stat2': 1056, 'stat3': 10563}}

flatten_hash(my_hash)
=> {"id"=>1, "system_name"=>"Sysem_1", "mem/stat1"=>10, "mem/stat2"=>1056, "mem/stat3"=>10563}

您需要更具体地说明输入格式。这是一个文本文件还是某种代码草图?您能提供一个上面JSON所需输出的示例吗?(为了简洁起见,删除一些键是可以的。)期望的输出是基于JSON,它将确定完整的“键”应该是什么,以及它的特定数字或字符串值,例如,
system\u name
将与
system\u 1
相关,
mem/stats1
将与
10
相关。这些相关键和值中的每一个都将被用作另一个函数的输入,该函数将尽可能地向其他函数发送它们的副本,或者注意,在最新版本的ruby中,您可以使用
#dig
方法
hash.dig(*key.split('/'))
 def flatten_hash(hash, result = {}, prefix = nil)
   hash.each do |k,v|
     if v.is_a? Hash
       flatten_hash(v, result, [prefix, k].compact.join('/'))
     else
       result[[prefix, k].compact.join('/')] = v
     end
   end
   result
 end

my_hash = {'id': 1, 'system_name': 'Sysem_1', 'mem': {'stat1': 10, 'stat2': 1056, 'stat3': 10563}}

flatten_hash(my_hash)
=> {"id"=>1, "system_name"=>"Sysem_1", "mem/stat1"=>10, "mem/stat2"=>1056, "mem/stat3"=>10563}
def key_path_value(key_string, my_json)    
  value = nil
  key_array = key_string.split("/")

  return value if key_array.empty?
  return my_json[key_array.last] if key_array.length == 1

  value = my_json[key_array.first.to_sym]
  key_array = key_array.drop(1)

  key_array.each do |key|
    break unless value.is_a? Hash
    value = value[key.to_sym]
  end

  return value
end