【问题标题】:Ruby on rails, How to compare two hashesh value to each other's?Ruby on rails,如何比较两个哈希值?
【发布时间】:2021-05-03 07:54:27
【问题描述】:

我正在尝试将一个哈希值与每个键的另一个哈希值进行比较。 像下面一样

db_data = [{"user_id"=>"000879", "dept"=>"1066", "type"=>"A", "rate"=>"999"},
          {"user_id"=>"000879", "dept"=>"1066","type"=>"AB", "rate"=>"999"},
          {"user_id"=>"008118", "dept"=>"10000869", "type"=>"A", "rate"=>"950"}]

file_data = [{"user"=>"00094967",  "dept_id"=>"0020",  "price"=>950, "div_type"=>"A"},
            {"user"=>"00094967", "dept_id"=>"0020",  "price"=>950, "div_type"=>"A"},
            {"user"=>"00094967",  "dept_id"=>"0020", "price"=>950, "div_type"=>"AB"}]

我需要比较第一个哈希数据中的特定值键,以与每个哈希值的第二个特定键值进行比较。 比如来自 file_data dept_id 比较 db_data 所有键 dept 值,如果没有得到则存储在变量中(不同的数据存储)

【问题讨论】:

    标签: ruby ruby-on-rails-6 ruby-2.3.1 ruby-3


    【解决方案1】:
    results = []
    existed = false
    file_data.each do |fd|
      dept_id = fd['dept_id']
      db_data.each do |dd|
        if dept_id == dd['dept']
          existed = true
          break
        end
      end
      results << fd if existed == false
    
      existed = false
    end
    
    # {"user"=>"00094967", "dept_id"=>"0020", "price"=>950, "div_type"=>"A"}
    # {"user"=>"00094967", "dept_id"=>"0020", "price"=>950, "div_type"=>"A"}
    # {"user"=>"00094967", "dept_id"=>"0020", "price"=>950, "div_type"=>"AB"}
    # because dept_id 0020 is not existed in db_data, so it will go to result
    

    因此,如果在 db_data 的第一个循环中存在 dept_id,它将不会将数据存储到结果中。如果直到 db_data 的最后一个元素不存在,那么它将转到结果。那么存在的标志将再次重置为false。

    也许这不是 ruby​​ist 的方式,但它会做

    【讨论】:

    • 它运行良好,我在其中稍作改动。
    【解决方案2】:

    如果我明白了,你可以使用Array#select

    file_data.select { |h| !db_data.map { |hh| hh['dept'] }.include? h['dept_id'] }
    

    其中db_data.map { |hh| hh['dept'] } 是一个数组,其中包含键'dept' 处的值。

    【讨论】:

    • map 有点矫枉过正(创建一个新的Array 只是为了处理它)相反我们可以使用file_data.select { |h| db.none? {|hh| hh['dept'] == h['dept_id']}}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2014-04-09
    • 2014-07-20
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多