检查Ruby哈希中是否存在多个键值对



我有以下Ruby哈希键值对:

[
{
"trait_type"=>"Status", 
"value"=>"Unbuilt", 
"display_type"=>nil, 
"max_value"=>nil, 
"trait_count"=>4866, 
"order"=>nil
}
]

我需要检查的是查看以下键值对是否存在:

{
"value"=>"Unbuilt", 
"trait_type"=>"Status"
}

本质上想要一些效果。。。

traits = [{"trait_type"=>"Status", "value"=>"Unbuilt", "display_type"=>nil, "max_value"=>nil, "trait_count"=>4866, "order"=>nil}]
filter_traits = {"value"=>"Unbuilt", "trait_type"=>"Status"}
traits.include? filter_traits

如果您使用的是ruby>=2.3,有一种奇特的新Hash >= Hash操作,在概念上类似于假设的contains?

使用traits阵列:

trait = traits[0]
trait >= {"trait_type" => "Status", "value" => "Unbuilt"}
# => true
trait >= {"trait_type" => "Status", "value" => "Built"}
# => false

所以你可以试试这样的东西:

traits.select{|trait|
trait >= filter_traits
}.length > 0
# => true
arr = [
{
"trait_type"=>"Status", 
"value"=>"Unbuilt", 
"display_type"=>nil, 
"max_value"=>nil, 
"trait_count"=>4866, 
"order"=>nil
}
]
h1 = { "value"=>"Unbuilt", "trait_type"=>"Status" }
h2 = { "value"=>"Rebuilt", "trait_type"=>"Status" }

这里有三个解决方案。

arr[0].slice(*h1.keys) == h1
#=> true
arr[0].slice(*h2.keys) == h2
#=> false

arr[0].values_at(h1.keys) == h1.values
#=> true
arr[0].values_at(h2.keys) == h2.values
#=> false

arr[0] == arr[0].merge(h1)
#=> true
arr[0] == arr[0].merge(h2)
#=> false

我们还有适当命名的all?any?方法,它们应该以非常合乎逻辑的方式完成您想要的任务。

我们所需要做的就是循环遍历您的filter_traits哈希并测试这些key:value对是否全部(或任何(等于(==(traits数组中的任何对应键:值对:

traits = [{"trait_type"=>"Status", "value"=>"Unbuilt", "display_type"=>nil, "max_value"=>nil, "trait_count"=>4866, "order"=>nil}]
filter_traits = {"value"=>"Unbuilt", "trait_type"=>"Status"}
filter_traits.all? {|k, v| filter_traits[k] == traits[0][k]}
#=>  true
filter_traits = {"value"=>"Built", "trait_type"=>"Status"}
filter_traits.all? {|k, v| filter_traits[k] == traits[0][k]}
#=>  false
filter_traits.any? {|k, v| filter_traits[k] == traits[0][k]}
#=>  true

最新更新