我如何返回array1中不在array2中的元素?

时间:2013-02-04 17:22:52

标签: ruby-on-rails ruby

我有一个对象数组,类型为Lab,existing_labs,以及不同的Labs数组new_labs。我为实验室定义了自己的==比较器。

existing_labs是数据库中已存在的实验室。 new_labs是基于它们在数据库中的存在而被保存的实验室。

现在我正在做这个

new_labs.each do |l|
  lab = Lab.new(l)
  exists = existing_labs.map{ |existing_lab| lab == existing_lab }
  lab.save unless exists.include? true
end

这可行,但如果其中一个或两个数组很大,则可能会很慢。我确信必须有更好的方法来做到这一点!

为清晰起见编辑:

我的问题是:是否有一种很好的方法可以使用我的new_labs方法返回existing_labs==中不存在的所有实验室?

5 个答案:

答案 0 :(得分:1)

你的问题一点也不清楚,但这里是你的代码的重构:

(new_labs.map{|l| Lab.new(l)} - existing_labs).each(&:save)

答案 1 :(得分:1)

new_labs.each do |l|
  lab = Lab.new(l)
  lab.save unless existing_labs.any?{|existing_lab| lab == existing_lab }
end

应该更快一点,因为没有为每个实验室创建一系列的真实和虚假。此外,any?会在找到true时退出。

答案 2 :(得分:0)

从中提取set并应用difference方法。

答案 3 :(得分:0)

您只需使用-方法:

> ary1 = [1, 2, 3, 4, 5]
> ary2 = [2,3]
> ary1 - ary2
=> [1, 4, 5]

另一个:

ary1.select { |e| not ary2.include? e }

这些方法中的任何一个都意味着在后台进行迭代,但我认为-方法在性能上取胜,可能会有几个基准测试。

答案 4 :(得分:0)

返回数组中不在array2中的元素

> ary1 = [1, 2, 3, 4, 5]
> ary2 = [2,7,9,3]
> ary1 - ary2
=> [1, 4, 5]

返回数组中不在array1中的元素

> ary1 = [1, 2, 3, 4, 5]
> ary2 = [2,7,9,3]
> ary2 - ary1
=> [7,9]