2014-11-03 175 views
0

我有散列數組(#1),看起來像這樣:紅寶石數組值串

data = [{"username"=>"Luck", "mail"=>"[email protected]", "active"=>0}] 

,我想用下面的哈希值的陣列來比較(#2):

test = [{"username"=>"Luck", "mail"=>"[email protected]", "active"=>"0"}] 

其中#1我從我的黃瓜場景(我最不希望出現的場景)中的mysql2(實際上是在數據庫中) 和#2從數據庫中獲得的數據。

根據定義#2必須是#1,所以我遵循與此代碼的子集:

data = data.to_set 
test = test.to_set 
assert test.subset?(data) 

的問題是在數據陣列的active值不爲一個字符串。在data的情況下,是Fixnum,在test的情況下,是String

我需要一個解決方案,即使對於數組中的多個散列也可以工作。 (由於數據庫可以返回結果的多行)這就是爲什麼我轉換成集,並使用subset?

從我得到了其他問題:

data.each do |obj| 
    obj.map do |k, v| 
    {k => v.to_s} 
    end 
end 

然而,它沒有爲我工作。有任何想法嗎?

假設你可以做:

  • 所有data鍵將永遠是字符串。
  • test中的所有鍵將始終爲字符串。並始終與data相同。
  • test中的所有值將始終爲字符串。
+0

是什麼,如果該類型不是一個字符串?你能用它顯示的數據類型更新你的例子嗎?你的目標是能夠說數據==測試? 'subset'從哪裏來? – Anthony 2014-11-03 00:11:20

+0

更正了這個問題,以提供您正在討論的答案。但對於初學者來說,獲取數據==測試會很好。 – 2014-11-03 00:13:25

+0

'test'是'data'的子數組,當且僅當'(test-data).empty? => true'。那是你要的嗎?請注意,如果'h'和'g'是散列,'h == g => true'當且僅當它們具有相同的鍵和值時,無論鍵順序如何。 – 2014-11-03 00:41:41

回答

0

假設我正確地理解了這個問題,這裏有幾個方法應該這樣做。

#1:轉換的哈希值到字符串

def stringify_hash_values(h) 
    h.each_with_object({}) { |(k,v),h| h[k] = v.to_s } 
end 

def sorta_subset?(data,test) 
    (test.map { |h| stringify_hash_values(data) } - 
    data.map { |h| stringify_hash_values(data) }).empty? 
end 

data = [{"username"=>"Luck", "mail"=>"[email protected]", "active"=>0}] 
test = [{"username"=>"Luck", "mail"=>"[email protected]", "active"=>"0"}] 
sorta_subset?(data,test) #=> true 

#2是否鍵轉換爲字符串相同的和值相等

require 'set' 

def hashes_sorta_equal?(h,g) 
    hk = h.keys 
    (hk.to_set == g.keys.to_set) && 
    (h.values_at(*hk).map(&:to_s) == g.values_at(*hk).map(&:to_s)) 
end 

def sorta_subset?(data,test) 
    test.all? { |h| data.any? { |g| hashes_sorta_equal?(g,h) } } 
end 

sorta_subset?(data,test) #=> true 
0

不要問我爲什麼它的工作原理,但我找到了解決辦法:

data.map! do |obj| 
    obj.each do |k, v| 
    obj[k] = "#{v}" 
    end 
end 

我認爲這事做什麼的數組和哈希函數改變物體本身,而不是創建改變了對象的副本。

+0

它的工作原理是將每個元素轉換爲字符串。在'data'數組中,'active'被映射到一個數字,而它被映射到'test'中的一個字符串。這導致比較失敗。 – 2014-11-03 00:56:24

+0

這就是我期待的。我做到了,但是我不確定這段代碼是如何完成這項工作的。 – 2014-11-03 01:06:20

+1

是的,轉換值轉換爲字符串,這將允許你使用'數據 - test',但要小心意外的副作用。如果,例如,您創建一個方法'sorta_subset?(測試數據)',你必須認識到,'test'和'data'將在調用方法後'sorta_subset?'返回了變化。一般來說,最好不要改變(「變異」)這些數組。你也不能改變'dup'ed數組中的值。請參閱我的解決方案中的#1,以便在不更改'data'或'test'的情況下執行此操作。 – 2014-11-03 01:31:57