Ruby -检查一个数组键/值是否在另一个数组中不存在



使用ruby,我试图从第一个数组键[:nb]查看。

考虑到以下数组包含数千个元素:

arr1 = [{"nb"=>"5df54g54df", "active"=>true, "brand"=>"aisle"},{"nb"=>"5jghfj264", "active"=>false, "brand"=>"leg"},{"nb"=>"5qwercv546", "active"=>true, "brand"=>"gem"}]
arr2 = [{"nb"=>"5df54g54df", "active"=>false, "brand"=>"aisle"},{"nb"=>"5jghfj264", "active"=>false, "brand"=>"gem"}]

到目前为止,我想的是这样的:

p (arr1.map(&:nb).find do |nb, val| arr2.map(&:nb)).!Include?(nb && val)

你有什么建议吗?在找到那些不在场的人之后,对于那些有着相似nb。价值,如何突出他们各自的不同之处?谢谢!

我对这个问题的理解是:"找到arr1的第一个元素h(一个哈希值),使得arr2(一个哈希值)中不存在h["nb"] == g["nb"]为真的元素g"。

arr1 = [
{"nb"=>"5df54g54df", "active"=>true, "brand"=>"aisle"},
{"nb"=>"5jghfj264", "active"=>false, "brand"=>"leg"},
{"nb"=>"5qwercv546", "active"=>true, "brand"=>"gem"}
]
arr2 = [
{"nb"=>"5df54g54df", "active"=>false, "brand"=>"aisle"},
{"nb"=>"5jghfj264", "active"=>false, "brand"=>"gem"}
]
require 'set'
nbs2 = arr2.each_with_object(Set.new) { |h,st| st << h["nb"] }
#=> #<Set: {"5df54g54df", "5jghfj264"}>
arr1.find { |h| !nbs2.include?(h["nb"]) }​
#=> {"nb"=>"5df54g54df", "active"=>true, "brand"=>"aisle"}

可以省略集合nbs2的构造,计算

arr1.find { |h| !arr2.include?(h["nb"]) }

,但这需要在arr2中对所检查的arr1的每个元素h进行线性搜索。相比之下,确定一个集合是否包含特定元素要快得多,所需的时间几乎与集合的大小无关。集合本身的构造需要通过arr2进行一次遍历,并且在处理arr2的每个元素时需要进行集合查找和可能的添加。

试试这个

arr1 = [
{"nb"=>"5df54g54df", "active"=>true, "brand"=>"aisle"},
{"nb"=>"5jghfj264", "active"=>false, "brand"=>"leg"},
{"nb"=>"5qwercv546", "active"=>true, "brand"=>"gem"}
]
arr2 = [
{"nb"=>"5df54g54df", "active"=>false, "brand"=>"aisle"},
{"nb"=>"5jghfj264", "active"=>false, "brand"=>"gem"}
]
# Just create a simple lambda for extracting nb values

extract_nb = ->(h) { h['nb'] }
# Using map just apply array intersection operation  
# for finding common key of 'nb'
p arr1.map(&extract_nb) & arr2.map(&extract_nb))

影响小

["5df54g54df", "5jghfj264"]

最新更新