【问题标题】:Using "AND" operation to select hashes from array of hashes in ruby使用“AND”操作从 ruby​​ 中的哈希数组中选择哈希
【发布时间】:2017-01-16 21:57:42
【问题描述】:
input = [ {"name" => "adam",  "nick" => ["kuruvi", "cali"] },
          {"name" => "eve",   "nick" => ["cali"]           },
          {"name" => "enoch", "nick" => []                 },    
          {"name" => "ebe",   "nick" => ["test", "wrong"]  },
          {"name" => "fred",  "nick" => ["da"]             } ]

我想在"nick" 中选择包含"da""cali" 的哈希。

input.select do |d|
  d["nick"].include?("cali")
end

给予

[{"name"=>"adam", "nick"=>["kuruvi", "cali"]},
 {"name"=>"eve", "nick"=>["cali"]}]

我们如何在检查中包含两个参数。例如:include?("cali","da") 这样我的结果就是

 [{"name"=>"adam", "nick"=>["kuruvi", "cali"]},
  {"name"=>"eve", "nick"=>["cali"]},
  {"name" => "fred",  "nick" => ["da"]}]

试过了

 i = ["da","cali"]
 input.select do |d|
   d["nick"].all? { |v| i.include? v }
 end

=> [{"name" => "adam",  "nick" => ["kuruvi", "cali"]},
    {"name" => "eve",   "nick" => ["cali"]},
    {"name" => "enoch", "nick" => []},
    {"name" => "fred",  "nick" => ["da"]}]

(但这也会返回带有"nick"=[] 的哈希)

【问题讨论】:

    标签: arrays ruby select hash include


    【解决方案1】:

    您可以使用any? 而不是使用all? 来达到预期的效果。

    input.select do |d|
      d["nick"].any? { |h| ['cali','da'].include?(h) }
    end
    

    这会返回

    [{"name"=>"adam", "nick"=>["kuruvi", "cali"]}, 
     {"name"=>"eve",  "nick"=>["cali"]}, 
     {"name"=>"fred", "nick"=>["da"]}]
    

    【讨论】:

      【解决方案2】:

      你需要做两个不同的include? 测试:

      l = d['nick']
      l.include?('da') && l.include?('cali')
      

      你也可以试试:

      (d['nick'] & %w[ da cali ]).length == 2
      

      或者,如果您愿意,您可以编写自己的方法来测试这样的重叠,甚至可以将其修补到数组中作为include_all?

      【讨论】:

      • 试过这个:: i = ["da","cali"] input.select do |d| d["nick"].all? { |v| i.包括? v } 结束
      • 以上返回 {"name" => "enoch", "nick" => []} 还有..其中 "nick" 是 []
      • all? 呼叫不在正确的位置。那是行不通的。
      【解决方案3】:

      根据您想要的结果,您指的是“或”,而不是“和”。下面使用Array#&的方法。

      input.reject { |h| (h["nick"] & ["cali", "da"]).empty? }
        #=> [{"name"=>"adam", "nick"=>["kuruvi", "cali"]},
        #    {"name"=>"eve", "nick"=>["cali"]},
        #    {"name"=>"fred", "nick"=>["da"]}] 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-02
        • 2018-04-24
        • 2013-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-05
        • 1970-01-01
        相关资源
        最近更新 更多