2016-09-08 84 views
0
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"哈希選擇從哈希散列數組。使用「AND」操作紅寶石

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"=[]也)

回答

1

你需要做兩個不同的include?測試:

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

您還可以嘗試:

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

或者,如果你願意,你可以寫你自己的方法來測試這樣的重疊,甚至修補成數組作爲include_all?

+0

嘗試這種:: I = [ 「DA」, 「卡利」] input.select做| d | d [「nick」]。all? {| v | i.include? v} end – user3636388

+0

上面的返回{「name」=>「enoch」,「nick」=> []}也..其中「nick」是[] – user3636388

+0

'all?'調用不在正確的位置那裏。這是行不通的。 – tadman

2

您想要的結果,你是指依據「或」 ,而不是「和」。以下使用方法Array#&

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

而不是使用all?的,你可以使用any?來達到預期的效果。

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"]}]