我有一个对象数组,类型为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
中==
中不存在的所有实验室?
答案 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]