根据嵌套哈希的内容从哈希中排除元素?
Posted
技术标签:
【中文标题】根据嵌套哈希的内容从哈希中排除元素?【英文标题】:Exclude elements from a hash based on contents of nested hash? 【发布时间】:2022-01-14 16:33:26 【问题描述】:我有以下 Ruby 哈希...
"Aura"=>"eyes"=>403, "moon"=>134, "burst"=>75, "psych"=>249,
"Power: Verdure"=>"max"=>4, "min"=>1,
"Power: Creature"=>"max"=>3, "min"=>1,
"Iris"=>"ice"=>208, "sky"=>220, "aqua"=>206, "deep"=>215, "dusk"=>229, "hide"=>213
我想删除哈希具有max
和min
的任何元素。最大值/最小值无关紧要。只是它们存在的事实。
意思是上面的哈希会变成...
"Aura"=>"eyes"=>403, "moon"=>134, "burst"=>75, "psych"=>249,
"Iris"=>"ice"=>208, "sky"=>220, "aqua"=>206, "deep"=>215, "dusk"=>229, "hide"=>213
如何删除这些元素?
【问题讨论】:
Hash#delete_if
或 Hash#reject
与 Hash#key?
结合使用应该可以帮助您实现目标
试试h.reject |_,v| (['max', 'min'] - v.keys).empty?
。见Hash#reject。要修改散列,请使用Hash#delete_if。请注意,delete_if
会返回新的哈希值,即使它没有改变,而Hash#reject! 会返回nil
,如果没有改变的话。
【参考方案1】:
正如 cmets 中所建议的,这可以通过应用 Hash#reject
和 Hash#has_key?
轻松解决。
data =
"Aura"=>"eyes"=>403, "moon"=>134, "burst"=>75, "psych"=>249,
"Power: Verdure"=>"max"=>4, "min"=>1,
"Power: Creature"=>"max"=>3, "min"=>1,
"Iris"=>"ice"=>208, "sky"=>220, "aqua"=>206, "deep"=>215, "dusk"=>229, "hide"=>213
pruned_data = data.reject |k, v| v.has_key?("min") && v.has_key?("max")
如果它在您的大脑中处理得更好,我们可以#select
仅不包含这两个键的散列。
pruned_data = data.select |k, v| !(v.has_key?("min") && v.has_key?("max"))
还有更聪明的方法,但这是一个非常简单的问题,似乎需要一个简单的解决方案。
【讨论】:
以上是关于根据嵌套哈希的内容从哈希中排除元素?的主要内容,如果未能解决你的问题,请参考以下文章