Mam dwie tablice zadań - utworzone i przypisane. Chcę usunąć wszystkie przydzielone zadania z tablicy utworzonych zadań. Oto mój działający, ale niechlujny kod:
@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
Jestem pewien, że jest lepszy sposób. Co to jest? Dzięki :-)
ruby
arrays
array-difference
Doctororange
źródło
źródło
Odpowiedzi:
W Rubim możesz odejmować tablice:
[1,2,3,4,5] - [1,3,4] #=> [2,5]
Zobacz dokumentację Array .
źródło
[1,2]-[1,2,3] => []
. Ale[1,2,3]-[1,2] => [3]
. Argh.Array#-
jest to ustalona różnica. Jest to bardziej odwrotnośćArray#|
set union niżArray#+
konkatenacji (wcale nie jest to operacja na zbiorach!).Powyższe rozwiązanie
usuwa wszystkie wystąpienia elementów w tablicy
b
z tablicya
.[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]
W niektórych przypadkach chcesz, aby wynik był
[1, 2, 3, 3, 5]
. Oznacza to, że nie chcesz usuwać wszystkich duplikatów, ale tylko poszczególne elementy.Możesz to osiągnąć przez
class Array def delete_elements_in(ary) ary.each do |x| if index = index(x) delete_at(index) end end end end
test
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]
Kod działa nawet wtedy, gdy dwie tablice nie są posortowane. W tym przykładzie tablice są sortowane, ale nie jest to wymagane.
źródło
delete_elements_in
nie jest dostępny we właściwym Rubim (ruby 2.6.3p62)