将哈希值与数组按顺序进行比较

时间:2016-09-02 11:39:09

标签: arrays ruby hash rspec

如果我有以下哈希和数组

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)

我还没到那里,想象循环中的循环不是最好的事情吗?

我想知道如何有效地解决这个问题。

3 个答案:

答案 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