2012-03-13 8 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 

テスト変数がちょうど763個の資源のうち141であることを起こるマッチ回数をデバッグするための変数である:ここで

は、私がこれまで持っているものです。しかし、このブロックを実行した後にresults.countを実行すると、私は622になるはずです。

明確にするには、タグ配列に一致がある場合はリソース配列の要素を削除するか、他のオプションは、一致が見つからない場合、リソース配列要素を新しい配列に含めることです。

これはJSONとしてブラウザに返され、タグがno_tags配列の値と一致するリソースを除外する必要があります。

+0

リソースに複数のタグが含まれている場合、そのタグの最後のタグに基づいて**の**が含まれます。それはおそらく違いがどこから来るのでしょうか。 –

答えて

1

@steenslagが私の問題の解決策を提案しました。

0

あなたのブラックリストの要素であるリソースに各タグためtestを増加しているが、あなたの結果のカウントは、あなたが維持しているリソースの数をカウントしています。リソースごとに1つ以上のタグがあると仮定すると、あなたは過剰にカウントされます。

少なくとも1つのタグがブラックリストと一致するすべてのリソースオブジェクトを除外する予定の場合は、内部ループ内でadd_to_arrayをtrueに設定しないでください。何delete_ifについて

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

:ここではより多くのルビーのような試み(未テストノートは)ですか?

2

名前とno_tagsの共通部分をテストできます。それは空でなければなりません。

results = resources.select do |r| 
    (r.tags.map(&:name) & no_tags).empty? 
end 
関連する問題