在 Rails 中,如何根据数组中每个对象中的字段执行两个数组的交集?
In Rails, how do I perform an intersect of two arrays based on a field in each object in the arrays?
我正在使用 Rails 4.2.7。我有两个数组(arr1 和 arr2),它们都包含我的模型对象。如果 arr1 中的对象具有与 arr2 中的对象匹配的字段“myfield1”(这是一个数字),是否有办法在两个数组上进行交集?两个数组都有独特的对象集。目前我有
arr1.each_with_index do |my_object, index|
arr2.each_with_index do |my_object2, index|
if my_object.myfield1 == my_object2.myfield1
results.push(my_object)
end
end
end
但这让我觉得效率有点低。我想有一种更简单的方法可以得到我需要的结果,但我对 Ruby 还不够熟悉,不知道该怎么做。
您可以构建值的交集以查找共同值,然后 select 具有共同值的记录。
field_in_both = arr1.map(&:myfield1) & arr2.map(&:myfield1)
intersection = arr1.select{|obj| field_in_both.include? obj.myfield1} +
arr2.select{|obj| field_in_both.include? obj.myfield1}
我在你的代码中注意到,你只存储来自 arr1 的记录...如果这是正确的行为,那么你可以简化我的回答
field_in_both = arr1.map(&:myfield1) & arr2.map(&:myfield1)
intersection = arr1.select{|obj| field_in_both.include? obj.myfield1}
我正在使用 Rails 4.2.7。我有两个数组(arr1 和 arr2),它们都包含我的模型对象。如果 arr1 中的对象具有与 arr2 中的对象匹配的字段“myfield1”(这是一个数字),是否有办法在两个数组上进行交集?两个数组都有独特的对象集。目前我有
arr1.each_with_index do |my_object, index|
arr2.each_with_index do |my_object2, index|
if my_object.myfield1 == my_object2.myfield1
results.push(my_object)
end
end
end
但这让我觉得效率有点低。我想有一种更简单的方法可以得到我需要的结果,但我对 Ruby 还不够熟悉,不知道该怎么做。
您可以构建值的交集以查找共同值,然后 select 具有共同值的记录。
field_in_both = arr1.map(&:myfield1) & arr2.map(&:myfield1)
intersection = arr1.select{|obj| field_in_both.include? obj.myfield1} +
arr2.select{|obj| field_in_both.include? obj.myfield1}
我在你的代码中注意到,你只存储来自 arr1 的记录...如果这是正确的行为,那么你可以简化我的回答
field_in_both = arr1.map(&:myfield1) & arr2.map(&:myfield1)
intersection = arr1.select{|obj| field_in_both.include? obj.myfield1}