查找散列与散列数组的部分匹配
Find partial match of hash against array of hashes
我有一个要匹配的哈希数组。
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 key/value 对的散列:
went = {paid: true, setup: false}
我想做的是将 went
与 me
进行比较,如果匹配 return 则 send_to
中的值
几乎像 include?
但这不起作用因为我的 went
哈希只有 2 key/value 对..
有这样的吗?
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)
不对键进行硬编码的方法:
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,其中显示了 subset/superset 运算符的一些历史。
me.find { |h| h == h.merge(went) }&.[](:send_to)
#=> "somewhere else"
me.find { |h| h == h.merge({:paid=>true, :setup=>"cat"}) }&.[](:send_to)
#=> nil
我有一个要匹配的哈希数组。
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 key/value 对的散列:
went = {paid: true, setup: false}
我想做的是将 went
与 me
进行比较,如果匹配 return 则 send_to
几乎像 include?
但这不起作用因为我的 went
哈希只有 2 key/value 对..
有这样的吗?
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)
不对键进行硬编码的方法:
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,其中显示了 subset/superset 运算符的一些历史。
me.find { |h| h == h.merge(went) }&.[](:send_to)
#=> "somewhere else"
me.find { |h| h == h.merge({:paid=>true, :setup=>"cat"}) }&.[](:send_to)
#=> nil