ruby - 读取嵌套哈希并生成类似结构的单独哈希

标签 ruby recursion hash

我正在尝试读取 JSON 模式,解析特定内容,并生成具有相同嵌套结构的新哈希。

我能够遍历原始架构,但是,当我尝试创建新的嵌套哈希时,它被展平了。

这是我到目前为止所拥有的:

require 'json'
@schema = JSON.parse("{
  "fields": [
    {
      "group": "common",
      "key": "1st_level"
    },
    {
      "object": "nested",
      "key": "order",
      "fields": [
        {
          "group": "common",
          "key": "2nd_level_1"
        },
        {
          "object": "nested",
          "key": "order2",
          "fields": [
            {
              "group": "common",
              "key": "3rd_level_1"
            }
          ]
        }
      ]
    }
  ]
}
")
@event_output = Hash.new

def parse_config(fields)
    if fields["group"].downcase == "common"
      @response = "HIT HERE"
    else
      @response = "INVALID GROUP"
    end
    return @response
end

def loop_params(parent, key, schema)
  @new_output = Hash.new
  @parent = parent
  schema["fields"].each do |fields|
    if fields["object"].nil? & !fields["group"].nil?
      @key = fields["key"]
      @repsonse = parse_config(fields)
      @new_output[@key] = @repsonse
      if key != ""
        @parent[key] = @new_output
      else
        @parent = @new_output
      end
    else
      print @parent
      @key = fields["key"]
      loop_params(@parent, @key, fields)
    end
  end
  return @parent
end
@event_output = loop_params(@event_output, "", @schema)
print "\n FINAL OUTPUT \n"
print @event_output

输出是:

{
    "1st_level"=>"HIT HERE",
    "order"=>{
        "2nd_level_1"=>"HIT HERE"
    },
    "order2"=>{
        "3rd_level_1"=>"HIT HERE"
    }
}

很接近,但我想要:

{
    "1st_level"=>"HIT HERE",
    "order"=>{
        "2nd_level_1"=>"HIT HERE",
        "order2"=>{
            "3rd_level_1"=>"HIT HERE"
        }
    }   
}

最佳答案

这应该可以解决您的问题:

def loop_params(schema)
  new_parent = Hash.new

  schema["fields"].each do |field|
    new_key = field["key"]

    if !field["group"].nil? && field["object"].nil?
      new_parent[new_key] = parse_config(field)
    else
      new_parent[new_key] = loop_params(field)
    end
  end

  new_parent
end

您的代码中存在一些可能导致错误的问题。使用@声明变量使其成为实例变量,这意味着它的值将在函数完成后保留。由于我们看不到您的程序的其余部分,我不知道您是否需要全部或任何它们,但我在没有它们的情况下编写了我的解决方案。

其他一些需要注意的事项:

if fields["object"].nil? & !fields["group"].nil?

您使用的&实际上是按位运算符and,而不是条件and。请改用 &&

此外,如果您使用 puts 而不是 printputs 将自动附加一个 "\n"对于您来说,记住这是一个很好的便利。

关于ruby - 读取嵌套哈希并生成类似结构的单独哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36922678/

相关文章:

javascript - 对以整数开头的哈希值进行过滤/排序时出现 Angular $parse 错误

ruby-on-rails - Rails 3 - 表单验证 - 将逻辑移动到回调或观察者?

ruby - 如何在 Ruby 中拆分 CSV 字符串?

arrays - 在 Ruby 中按字母顺序对数组内的数组进行排序?

java - 打印出最小找零算法中使用的面额时出现问题

mysql - 如何在 MySQL 中以 Ruby 哈希存储多封电子邮件?

ruby - 变量赋值 "x, = 1,2"在 Ruby 中如何工作?

list - LISP中列表元素的递归处理

javascript - 为什么异步函数比同步函数需要更多时间来执行?

python - 使用 M2Crypto 在 Python 2.4 中生成 SHA-256 哈希