在Ruby中从另一个数组中减去一个数组

我有两个任务的数组 – 创build和分配。 我想从创build的任务数组中删除所有分配的任务。 这是我的工作,但凌乱的代码:

@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中减去数组:

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

    ary – other_ary→new_ary数组差异

    返回原始数组副本的新数组,除去也出现在other_ary中的所有项目。 订单从原始数组中保留下来。

    它比较元素使用他们的散列和eql? 方法的效率。

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

    如果您需要类似set的行为,请参阅库类Set。

    请参阅Array文档。

    以上的解决scheme

     a - b 

    从数组a删除数组b中元素的所有实例。

     [ 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 

    testing

     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] 

    即使两个数组没有sorting,代码也能正常工作。 在这个例子中,数组是sorting的,但这不是必需的。