我有两个具有相同键但值不同的哈希数组。
A = [{:a=>1, :b=>4, :c=>2},{:a=>2, :b=>1, :c=>3}]
B = [{:a=>1, :b=>1, :c=>2},{:a=>1, :b=>3, :c=>3}]
我试图将A中的第一个哈希值与B中的第一个哈希值进行比较,依此类推,使用它们的键,并确定哪个键与哪个值不匹配,如果它们不匹配。请帮忙。
A.each_key do |key|
if A[key] == B[key]
puts "#{key} match"
else
puts "#{key} dont match"
答案 0 :(得分:5)
我不确定您想要进行哪些比较,因此我将展示回答不同问题的方法。你想对两个哈希数组进行成对比较,但这并不比仅仅比较两个哈希更困难,我稍后会说明。现在,假设您只想比较两个哈希值:
h1 = {:a=>1, :b=>4, :c=>2, :d=>3 }
h2 = {:a=>1, :b=>1, :c=>2, :e=>5 }
h1
或h2
(或两者)中有哪些键?
h1.keys | h2.keys
#=> [:a, :b, :c, :d, :e]
请参阅Array#|。
两个哈希中有哪些键?
h1.keys & h2.keys
#=> [:a, :b, :c]
请参阅Array#&。
h1
但h2
中有哪些键?
h1.keys - h2.keys
#=> [:d]
请参阅Array#-。
h2
但h1
中有哪些键?
h2.keys - h1.keys #=> [:e]
只有一个哈希中的哪些键?
(h1.keys - h2.keys) | (h2.keys - h1.keys)
#=> [:d, :e]
或
(h1.keys | h2.keys) - (h1.keys & h2.keys)
两个哈希中的哪些键在两个哈希中都有相同的值?
(h1.keys & h2.keys).select { |k| h1[k] == h2[k] }
#=> [:a, :c]
请参阅Array#select。
两个哈希值中的哪些键有两个哈希值?
(h1.keys & h2.keys).reject { |k| h1[k] == h2[k] }
#=> [:b]
假设现在我们有两个哈希数组:
a1 = [{:a=>1, :b=>4, :c=>2, :d=>3 }, {:a=>2, :b=>1, :c=>3, :d=>4}]
a2 = [{:a=>1, :b=>1, :c=>2, :e=>5 }, {:a=>1, :b=>3, :c=>3, :e=> 6}]
并希望成对地比较哈希。要做到这一点,首先采取上面的兴趣计算,并将其包装在一个方法中。例如:
def keys_in_both_with_different_values(h1, h2)
(h1.keys & h2.keys).reject { |k| h1[k] == h2[k] }
end
然后写:
a1.zip(a2).map { |h1,h2| keys_in_both_with_different_values(h1, h2) }
#=> [[:b], [:a, :b]]
请参阅Enumerable#zip。
答案 1 :(得分:0)
因为你要比较数组的元素......
A.each_with_index do |hasha, index|
hashb = B[index]
hasha.each_key do |key|
if hasha[key] == hashb[key]
puts "in array #{index} the key #{key} matches"
else
puts "in array #{index} the key #{key} doesn't match"
end
end
end
编辑 - 添加了遗失end
!
答案 2 :(得分:0)
当你处理一个数组时,你应该引用一个带有开 - 关括号的元素' []'如在
$this->db->distinct('pd_model_code AS Model_SKU');
$this->db->select('pd_model_description AS `Model_Title`');
$this->db->like('pd_vendor',$brand);
$query=$this->db->get('iris_product_data');
如果要访问哈希中的元素,则需要使用带有相应键的开闭括号,如
A[index at which lies the element you are looking for]
(引用与键':a'对应的值,它是类型符号。)
在这种情况下,所讨论的数组是哈希嵌套在数组中的。因此,例如,表达式B [0] [:c]将给出2。
要比较A中的第一个哈希值和B中的第一个哈希值,A中的第二个哈希值以及B中的第二个哈希值,依此类推,你可以在Array对象上使用each_with_index方法,就像这样;
A[:a]
,它按照以下顺序检查基于键的值,这些符号是符号; :a - > :b - > :c - > :a - > :b - > :C 这将打印出来;
A = [{:a=>1, :b=>4, :c=>2},{:a=>2, :b=>1, :c=>3}]
B = [{:a=>1, :b=>1, :c=>2},{:a=>1, :b=>3, :c=>3}]
sym = [:a, :b, :c]
A.each_with_index do |hash_a, idx_a|
sym.each do |sym|
if A[idx_a][sym] == B[idx_a][sym]
puts "Match found! (key -- :#{sym}, value -- #{A[idx_a][sym]})"
else
puts "No match here."
end
end
end
如果您不熟悉,each_with_index方法可能看起来有点神秘。
如果您对此感到不舒服,可能需要检查;
http://apidock.com/ruby/Enumerable/each_with_index
最后但并非最不重要的是,不要忘记在一个块的末尾添加“结束”(即do / end之间的代码)和代码中的if语句。 / p>
我希望它有所帮助。