У меня есть два массива Задач - созданные и назначенные. Я хочу удалить все поставленные задачи из массива созданных задач. Вот мой рабочий, но беспорядочный код:
@assigned_tasks = @user.assigned_tasks
@created_tasks = @user.created_tasks
#Do not show created tasks assigned to self
@created_not_doing_tasks = Array.new
@created_tasks.each do |task|
unless @assigned_tasks.include?(task)
@created_not_doing_tasks << task
end
end
Я уверен, что есть способ получше. Что это такое? Благодаря :-)
ruby
arrays
array-difference
доктор апельсин
источник
источник
Ответы:
В Ruby можно вычитать массивы:
[1,2,3,4,5] - [1,3,4] #=> [2,5]
См. Документацию по массиву .
источник
[1,2]-[1,2,3] => []
. Но[1,2,3]-[1,2] => [3]
... Ага.Array#-
это разница в наборах. Это скорее обратное объединениюArray#|
множеств, чемArray#+
конкатенация (а вовсе не операция над множествами!).Вышеупомянутое решение
удаляет все экземпляры элементов в массиве
b
из массиваa
.[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]
В некоторых случаях вы хотите, чтобы результат был
[1, 2, 3, 3, 5]
. То есть вы не хотите удалять все дубликаты, а только элементы по отдельности.Вы можете добиться этого с помощью
class Array def delete_elements_in(ary) ary.each do |x| if index = index(x) delete_at(index) end end end end
контрольная работа
irb(main):198:0> a = [ 1, 1, 2, 2, 3, 3, 4, 5 ] => [1, 1, 2, 2, 3, 3, 4, 5] irb(main):199:0> b = [ 1, 2, 4 ] => [1, 2, 4] irb(main):200:0> a.delete_elements_in(b) => [1, 2, 4] irb(main):201:0> a => [1, 2, 3, 3, 5]
Код работает, даже если два массива не отсортированы. В примере массивы отсортированы, но это не обязательно.
источник
delete_elements_in
недоступен в собственно Ruby (ruby 2.6.3p62)