【问题标题】:Find partial match of hash against array of hashes查找哈希与哈希数组的部分匹配
【发布时间】:2018-06-14 17:21:44
【问题描述】:

我有一个要匹配的哈希数组。

me = [{paid: true, setup: true, send_to: "somewhere"},
     {paid: true, setup: false, send_to: "somewhere else"},
     {paid: false, setup: true, send_to: "somewhere new"},
     {paid: false, setup: false, send_to: "somewhere outside"}]

我有一个只有 2 个键/值对的哈希:

went = {paid: true, setup: false}

我想要做的是将wentme 进行比较,如果匹配则返回send_to 中的值

几乎像 include? 但这不起作用,因为我的 went 哈希只有 2 个键/值对..

【问题讨论】:

    标签: ruby-on-rails ruby enumerable


    【解决方案1】:

    这样的吗?

    me.find { |item| item[:paid] == went[:paid] && item[:setup] == went[:setup] }&.fetch(:send_to)
    

    或者这个

    me.find { |item| item.values_at(:paid, :setup) == went.values_at(:paid, :setup) }&.fetch(:send_to)
    

    【讨论】:

    • 我的荣幸先生 :)
    【解决方案2】:

    无需硬编码密钥的方法:

    me.find { |item| went <= item }&.fetch(:send_to)
    
    me.find { |item| item >= went }&.fetch(:send_to)
    
    me.find(&went.method(:<=))&.fetch(:send_to)
    
    me.find { |item| item.values_at(*went.keys) == went.values }&.fetch(:send_to)
    
    me.find { |item| went.to_a & item.to_a == went.to_a }&.fetch(:send_to)
    
    me.find { |item| item.merge(went) == item }&.fetch(:send_to)
    

    我最喜欢前两个。最后一个来自this page,它显示了子集/超集运算符的一些历史。

    【讨论】:

      【解决方案3】:
      me.find { |h| h == h.merge(went) }&.[](:send_to)
        #=> "somewhere else"
      me.find { |h| h == h.merge({:paid=>true, :setup=>"cat"}) }&.[](:send_to)
        #=> nil
      

      【讨论】:

      • 你忘记了第二部分。而且啊,现在我正在考虑切换回“h”......我从那个切换到“item”以便与其他答案进行比较:-)
      • 谢谢@Stefan。我修好了。
      猜你喜欢
      • 1970-01-01
      • 2013-07-20
      • 2020-01-27
      • 2014-07-12
      • 1970-01-01
      • 2013-05-19
      • 2013-08-20
      • 2014-05-19
      • 2014-12-30
      相关资源
      最近更新 更多