2016-01-20 126 views
-3

重構此條件的任何提示?檢查多哈希鍵是否存在

params = {:p1=>"foo", :p2=>true, :p3=>nil, :pN=>""} 

if params[:p1].present? && params[:p2].present? && params[:pN].present? 
    # do something... 
+3

重構請求在這裏有些偏離主題。有一個網站:http://codereview.stackexchange.com –

+2

只是一個觀點,Code Review只需要**真實的**代碼。 「Foo」,「Bar」等會在幾秒鐘內關閉。如果您在某個實際項目中存在該條件,請發佈實際代碼。 – Kaz

+0

爲什麼'p3'沒有在'if'條件中被檢查?你對所有按鍵的數值不感興趣,但只有少數幾個?另外,爲什麼你在'params [「p1」]'中使用字符串'「p1」',當鍵實際上是一個符號':p1'時 - 兩者都不相同。 –

回答

3

事情是這樣的:

params.values_at(:p1, :p2, :pN).all?(&:present?) 
1
if params.values_at(*%i[p1 p2 p3]).all?(&:present?) 

values_at返回您提供的每個鍵的值的Arrayall?true如果謂詞(present?)爲true爲可枚舉的每個成員。 values_at將包括nil爲一個丟失的關鍵(而不是省略它),所以你不必擔心數組摺疊到只有現值。

1
keys = [:p1, :p2, :pN] 

puts "hi" if keys.all? { |k| params[k].present? } 

這具有儘快params[k].present?false終止散列查詢的優點。

+0

除了'keys',我們可以使用'params.keys',因爲'params'是一個散列。如果我沒有弄錯,OP似乎在檢查所有鍵是否有值'現在?'。 –

+0

@Wand,OP似乎並不關心':p3'。 –

+0

我明白了。雖然奇怪! –