簡體   English   中英

Ruby哈希值數組到字符串

[英]Ruby array of hashes values to string

我有一個哈希數組(#1),看起來像這樣:

data = [{"username"=>"Luck", "mail"=>"root@localhost.net", "active"=>0}]

我正在嘗試與以下哈希數組(#2)進行比較:

test = [{"username"=>"Luck", "mail"=>"root@localhost.net", "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所有值將始終為字符串。

不要問我為什么它起作用,但是我找到了一個解決方案:

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

我認為這與數組和散列上的哪些功能會更改對象本身有關,而不是創建對象的已更改副本。

假設我正確理解了這個問題,可以采取以下兩種方法。

#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"=>"root@localhost.net", "active"=>0}]
test = [{"username"=>"Luck", "mail"=>"root@localhost.net", "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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM