Soustraire un tableau d’un autre en Ruby

J’ai deux tableaux de tâches – créés et assignés. Je veux supprimer toutes les tâches assignées du tableau des tâches créées. Voici mon code de travail, mais désordonné:

@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 

Je suis sûr qu’il y a un meilleur moyen. Qu’Est-ce que c’est? Merci 🙂

Vous pouvez soustraire des tableaux dans Ruby:

 [1,2,3,4,5] - [1,3,4] #=> [2,5] 

ary – other_ary → new_ary Array Difference

Retourne un nouveau tableau qui est une copie du tableau d’origine, en supprimant tous les éléments qui apparaissent également dans other_ary. L’ordre est préservé du tableau d’origine.

Il compare les éléments en utilisant leur hash et eql? méthodes d’efficacité.

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]

Si vous avez besoin d’un comportement similaire à un ensemble, consultez la classe de bibliothèque Set.

Voir la documentation Array .

La solution ci-dessus

 a - b 

supprime toutes les instances d’éléments du tableau b du tableau a .

 [ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ] 

Dans certains cas, vous voulez que le résultat soit [1, 2, 3, 3, 5] . En d’autres termes, vous ne voulez pas supprimer tous les doublons, mais uniquement les éléments individuellement.

Vous pourriez y arriver en

 class Array def delete_elements_in(ary) ary.each do |x| if index = index(x) delete_at(index) end end end end 

tester

 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] 

Le code fonctionne même lorsque les deux tableaux ne sont pas sortingés. Dans l’exemple, les tableaux sont sortingés, mais ce n’est pas obligatoire.