2012-03-13 78 views
1

我想從數組中刪除元素,如果該數組中的值匹配給定的字符串。我有一個數組是有一個標籤數組。我正在比較標籤的名稱,以查看它們是否符合用戶希望從其搜索中排除的內容。如果是這樣,我想要從主數組中刪除該元素,否則可能添加不匹配的元素。字符串匹配時刪除數組元素標籤

這是我到目前爲止有:

results = Array.new 
test = 0 
no_tags.each do |no_tag| #an array of tags whose resources are not to be included 
    resources.each do |r| 
    add_to_array = false 
    r.tags.each do |t| 
     if t.name.eql? no_tag 
     test += 1 
     add_to_array = false 
     else 
     add_to_array = true 
     end 
    end 

    if add_to_array 
     results << r 
    end 
    end 
end 

測試變量只是調試匹配出現這恰好是141出的763個資源數量的變量。但是,當我做results.count這個塊運行後,我只得到732,當我應該得到622.

爲了澄清我需要刪除資源數組元素,如果標籤數組包含匹配,或如果找不到匹配項,其他選項將會將資源數組元素包含到新數組中。

這將作爲JSON返回給瀏覽器,我需要排除標籤與no_tags數組值相匹配的資源。

+0

如果某個資源具有多個標籤,則包含該標籤的決定僅基於最後一個標籤**。這可能是差異來自哪裏。 – 2012-03-13 21:07:39

回答

1

@steenslag給了我提供解決方案的想法。

resources.delete_if do |resource| 
    (resource.tags.map(&:name) & no_tags).present? 
end 
0

你是在一種資源,是你的黑名單的元素每個標籤遞增test,但你的結果計數計數資源的數量你保持。假設每個資源都有多個標籤,那麼您就是過度計數。

如果您的目的是排除至少有一個標籤與您的黑名單相匹配的每個資源對象,則不應在您的內部循環中將add_to_array設置爲true。這裏有一個更紅寶石般的嘗試(注:未經測試)

results = Array.new 
test = 0 
resources.each do |r| 
    # are any tags elements of no_tags? 
    if (r.tags & no_tags).blank? # "&": set intersection 
    results << r 
    else 
    test += 1 
    end 
end 
0

什麼delete_if

resources.delete_if! { |r| (r.tags & no_tags).present? } 
2

您可以測試名稱和no_tags的交集。它應該是空的。

results = resources.select do |r| 
    (r.tags.map(&:name) & no_tags).empty? 
end