Удаление элементов массива, когда строка соответствует тегам - PullRequest
1 голос
/ 13 марта 2012

Я пытаюсь удалить элементы из массива, если значение в этом массиве соответствует заданной строке.

У меня есть массив, который имеет массив тегов.Я сравниваю имена тегов, чтобы увидеть, соответствуют ли они тому, что пользователь хочет исключить из своего поиска.Если это произойдет, я хотел бы либо удалить этот элемент из основного массива, либо, возможно, добавить элемент, который не соответствует.

Вот что у меня есть:

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 

Переменная test - это просто переменная для отладки количества совпадающих вхождений, которое оказывается 141 из 763 ресурсов.Однако, когда я делаю results.count после запуска этого блока, я получаю 732 только тогда, когда должен получить 622.

Для пояснения мне нужно либо удалить элемент массива ресурсов, если массив тегов содержит совпадение,или другой вариант - включить элемент массива ресурсов в новый массив, если совпадение не найдено.

Это будет возвращено браузеру как JSON, и мне нужно исключить ресурсы, теги которых соответствуют значениям массива no_tags.

Ответы [ 4 ]

2 голосов
/ 13 марта 2012

Вы можете проверить пересечение имен и тегов no_tags.Он должен быть пустым.

results = resources.select do |r|
  (r.tags.map(&:name) & no_tags).empty?
end
1 голос
/ 15 марта 2012

@ steenslag дал мне идею, которая предложила решение моей проблемы.

resources.delete_if do |resource| 
  (resource.tags.map(&:name) & no_tags).present? 
end
0 голосов
/ 13 марта 2012

А как же delete_if?

resources.delete_if! { |r| (r.tags & no_tags).present? }
0 голосов
/ 13 марта 2012

Вы увеличиваете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...