Ruby数组的哈希值为字符串

时间:2014-11-03 00:05:26

标签: ruby arrays hash cucumber

我有一系列散列(#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的值不是字符串。如果dataFixnum,则testString

我需要一个甚至可以在数组中使用多个哈希的解决方案。 (因为数据库可以返回多行结果)这就是我转换为集合并使用subset?

的原因

从我得到的其他问题:

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

然而它对我不起作用。有什么想法吗?

您可以做出的假设:

  • data中的所有键都将是字符串。
  • test中的所有键都将是字符串。始终与data相同。
  • test中的所有值都将是字符串。

2 个答案:

答案 0 :(得分:0)

不要问我为什么会这样,但我找到了一个解决方案:

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

我认为它与数组和散列上的哪些函数有关,它们会改变对象本身,而不是创建对象的更改副本。

答案 1 :(得分: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"=>"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