根据嵌套哈希的内容从哈希中排除元素?

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

我想删除哈希具有maxmin 的任何元素。最大值/最小值无关紧要。只是它们存在的事实。

意思是上面的哈希会变成...


  "Aura"=>"eyes"=>403, "moon"=>134, "burst"=>75, "psych"=>249,
  "Iris"=>"ice"=>208, "sky"=>220, "aqua"=>206, "deep"=>215, "dusk"=>229, "hide"=>213

如何删除这些元素?

【问题讨论】:

Hash#delete_ifHash#rejectHash#key? 结合使用应该可以帮助您实现目标 试试h.reject |_,v| (['max', 'min'] - v.keys).empty? 。见Hash#reject。要修改散列,请使用Hash#delete_if。请注意,delete_if 会返回新的哈希值,即使它没有改变,而Hash#reject! 会返回nil,如果没有改变的话。 【参考方案1】:

正如 cmets 中所建议的,这可以通过应用 Hash#rejectHash#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")) 

还有更聪明的方法,但这是一个非常简单的问题,似乎需要一个简单的解决方案。

【讨论】:

以上是关于根据嵌套哈希的内容从哈希中排除元素?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 修改嵌套哈希的元素

数据结构:哈希表(根据数值查找的key-value容器)

从哈希/ YAML 中删除所有空元素?

将带有整数的数组转换为散列哈希值[closed]

Ruby Style:如何检查嵌套的哈希元素是不是存在

Ruby Style:如何检查嵌套的哈希元素是不是存在