2015-09-07 40 views
4

嘗試過濾數組中的某些條目。不能保證它們在主數組中,所以我正在通過迭代進行測試。過濾器以排除陣列中的元素

total = ['alpha', 'bravo', 'charlie', 'delta', 'echo'] 
hide = ['charlie', 'echo'] 

pick = [] 
for i in total 
    if !hide.include?(i) 
    puts i 
    pick.push(i) 
    end 
end 
puts pick 

這是行不通的。有沒有更好的方式提供這種過濾器?

+0

你是什麼意思不工作?對我來說似乎沒問題......你期望的迴應是什麼? – dax

+1

預期回覆: –

回答

12

當你在使用數組時,你可以簡單地通過減去這些列表中刪除現有的元素:

total = ['alpha', 'bravo', 'charlie', 'delta', 'echo'] 
hide = ['charlie', 'echo'] 
pick = total - hide 

puts pick 
=> ['alpha', 'bravo', 'delta'] 

如果您需要的路口,使用&操作:

total = ['alpha', 'bravo', 'charlie', 'delta', 'echo'] 
hide = ['charlie', 'echo', 'example'] 
pick = total & hide 

puts pick 
=> ['charlie', 'echo'] 

欲瞭解更多信息檢查rubydoc Array。很可能你會在這裏找到你需要的東西。

+0

好的,我不知道你能做到這一點。這是一個有用的方法。我來自一種語言,你幾乎不得不寫自己的語言。做得很好。謝謝。 –

8

您的代碼適用於我。 至於「更好的方式」,你可以使用Array#reject

total = ['alpha', 'bravo', 'charlie', 'delta', 'echo'] 
hide = ['charlie', 'echo'] 

pick = total.reject do |i| 
    hide.include?(i) 
end 
puts pick 

它不僅是更地道,但Ruby的for i in collection迴路中的collection.each { |i| }方面來實現。一個塊的方法幾乎總是一個更好的選擇。

+0

我是Ruby新手。那麼你會怎麼解釋那個塊呢?我一直將這些塊視爲迭代器,而不是如何在這裏呈現。 –

+0

@Rich_F'reject'在這裏是關鍵,看着文檔,你會看到你可以通過一個塊來拒絕,並且它會返回一個「新」列表。 –

+0

@TheF是的,我得到的那部分。我只是對這個習慣問題感興趣,因爲它在我的腦海中註冊的方式不同。 「拒絕那些與'隱藏'中匹配的數組」。意譯是我所感興趣的。你能否用「do」這個詞來解釋所有這些,所以它很清楚?我已經使用了很長一段時間了,但'做'是一個令人困惑的項目。 –