使用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"]