如果我有以下哈希和数组
hash = {'i' => 'i', 'av' => 'av', 'deviceName' => 'Genymotionvbox86p'}
array = ['i', 'av', 'Genymotionvbox86p']
我怎么能比较数组中的每个项目都以相同的顺序匹配哈希值
到目前为止我已经
了array.each do |value|
hash.each do |k, v|
expect(v).to eq(value), "expected #{k} to equal #{v}, instead got #{value}"
end
end
这是失败的,因为我
expected av to equal av, instead got i (RSpec::Expectations::ExpectationNotMetError)
我还没到那里,想象循环中的循环不是最好的事情吗?
我想知道如何有效地解决这个问题。
答案 0 :(得分:5)
失败的原因是因为您将每个数组值与每个哈希值进行比较。要解决这个问题,你可以利用两个数组数组相等的事实,如果它们的所有值都是相等的:
expect(array).to eq hash.values
答案 1 :(得分:1)
如果你真的想逐项比较,你理所当然地注意到循环中的循环不是可行的方法。您需要一个循环来迭代这两个结构。
为此,您可以使用zip
来组合散列和数组:
hash.zip(array).each do |(hash_key, hash_value), array_item|
expect(hash_value).to eq array_item
end
或者您可以使用索引:
hash.each_with_index do |(k, v), i|
expect(v).to eq array[i]
end
答案 2 :(得分:0)
我如何比较数组中的每个项目与哈希值匹配 值按相同的顺序
怎么样?
> array == hash.values
#=> true
> array = ["i", "Genymotionvbox86p", "av"] # change the order
> array == hash.values
#=> false