查找散列与散列数组的部分匹配

时间:2018-01-04 22:20:31

标签: ruby-on-rails ruby enumerable

我有一系列我正在匹配的哈希值。

me = [{paid: true, setup: true, send_to: "somewhere"},
     {paid: true, setup: false, send_to: "somewhere else"},
     {paid: false, setup: true, send_to: "somewhere new"},
     {paid: false, setup: false, send_to: "somewhere outside"}]

我有一个只有2个键/值对的哈希:

went = {paid: true, setup: false}

我想要做的是将wentme进行比较,如果匹配则返回send_to

中的值

几乎与include?相似但不起作用,因为我的went哈希只有2个键/值对..

3 个答案:

答案 0 :(得分:4)

有这样的吗?

me.find { |item| item[:paid] == went[:paid] && item[:setup] == went[:setup] }&.fetch(:send_to)

或者

me.find { |item| item.values_at(:paid, :setup) == went.values_at(:paid, :setup) }&.fetch(:send_to)

答案 1 :(得分:0)

没有硬编码键的方法:

me.find { |item| went <= item }&.fetch(:send_to)

me.find { |item| item >= went }&.fetch(:send_to)

me.find(&went.method(:<=))&.fetch(:send_to)

me.find { |item| item.values_at(*went.keys) == went.values }&.fetch(:send_to)

me.find { |item| went.to_a & item.to_a == went.to_a }&.fetch(:send_to)

me.find { |item| item.merge(went) == item }&.fetch(:send_to)

我最喜欢前两个。最后一个来自this page,它显示了子集/超集运算符的一些历史记录。

答案 2 :(得分:0)

me.find { |h| h == h.merge(went) }&.[](:send_to)
  #=> "somewhere else"
me.find { |h| h == h.merge({:paid=>true, :setup=>"cat"}) }&.[](:send_to)
  #=> nil