【问题标题】:Parse a complex hash and return changes to keys解析复杂的哈希并返回对键的更改
【发布时间】:2019-04-20 07:08:03
【问题描述】:

我正在使用 json-compare gem 来比较两个不同的 json 文件。

示例文件 1:

{"suggestions": [
      {
        "id1": 1,
        "title1": "Test",
        "body1": "Test"
       }
    ]
}

示例文件 2:

{"suggestions": [
      {
        "id2": 1,
        "title2": "Test",
        "body2": "Test"
      }
    ]
}

gem 运行良好,并吐出如下所示的哈希:

  {:update=> 
    {"suggestions" => 
        {:update=>
          {0=>
            {:append=>
                {"id2"=>1, "title2"=>"Test", "body2"=>"Test"}, 
             :remove=>
                {"id1"=>1, "title1"=>"Test", "body1"=>"Test"}, 
             }
          }
        }
    }
}

如何解析并返回所有更改 json Keys 的地方?为了简单起见,我将如何输入控制台:

id1 changed to id2
title1 changed to title2
body1 changed to body2

出于我正在构建的目的,我不需要知道值的变化。我只需要知道 id1 变成了 id2 等等。

【问题讨论】:

  • 你说的“id2改成id1”是什么意思?你如何从哈希中推断出来? :update:append:remove 是否对问题具有重要意义? (我不熟悉 gem。)请编辑您的问题以提供进一步的解释。
  • 用 json 文件的例子更新了问题。 :append 等由 gem 注入到哈希中。
  • 如果h 是gem 返回的哈希值arr = h[:update]["suggestions"][:update][0] => {:append=>{"id2"=>1, "title2"=>"Test", "body2"=>"Test"}, :remove=>{"id1"=>1, "title1"=>"Test", "body1"=>"Test"}},您可以从中计算pairs = g[:append].keys.zip(arr[:remove].keys) #=> [["id2", "id1"], ["title2", "title1"], ["body2", "body1"]] 这提供了puts 语句所需的值。这是你想要的吗?然而,这并不普遍。

标签: ruby-on-rails json ruby hash


【解决方案1】:

除非您正在传递密钥顺序,否则无法判断 id1id2title2 替换为 title1,或者 id1 变为 title1id2 变为title2。听起来您需要与实际键名相关的特定逻辑(在此示例中搜索不同的整数后缀)。

【讨论】:

    【解决方案2】:

    也许这足以达到目的:

    def find_what_changed_in(mhash, result = [])
      result << mhash
      return if mhash.keys == [:append, :remove]
      mhash.keys.each { |k| find_what_changed_in(mhash[k], result) }
      result.last
    end
    
    find_what_changed_in(changes)
    
    #=> {:append=>{"id2"=>1, "title2"=>"Test", "body2"=>"Test"}, :remove=>{"id1"=>1, "title1"=>"Test", "body1"=>"Test"}}
    

    地点:

    changes =   {:update=> 
        {"suggestions" => 
            {:update=>
              {0=>
                {:append=>
                    {"id2"=>1, "title2"=>"Test", "body2"=>"Test"}, 
                 :remove=>
                    {"id1"=>1, "title1"=>"Test", "body1"=>"Test"}, 
    ...
    

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 2011-05-19
      • 1970-01-01
      相关资源
      最近更新 更多