从嵌套哈希中删除特定元素

BC0*_*C00 17 ruby hash-of-hashes

我正在尝试使用嵌套哈希.我有一副牌代表如下:

deck_of_cards = {
:hearts => {:two => 2, :three => 3, :four => 4, :five => 5, :six => 6, :seven => 7, :eight => 8, :nine => 9, :ten => 10, :jack => 10, 
            :queen => 10, :king => 10, :ace => 11},
:spades => {:two => 2, :three => 3, :four => 4, :five => 5, :six => 6, :seven => 7, :eight => 8, :nine => 9, :ten => 10, :jack => 10, 
            :queen => 10, :king => 10, :ace => 11},
:clubs => {:two => 2, :three => 3, :four => 4, :five => 5, :six => 6, :seven => 7, :eight => 8, :nine => 9, :ten => 10, :jack => 10, 
            :queen => 10, :king => 10, :ace => 11},
:diamonds => {:two => 2, :three => 3, :four => 4, :five => 5, :six => 6, :seven => 7, :eight => 8, :nine => 9, :ten => 10, :jack => 10, 
            :queen => 10, :king => 10, :ace => 11}
}
Run Code Online (Sandbox Code Playgroud)

我的目标是能够从卡座上移除一张特定的卡片并返回没有该特定卡片的卡片组.有人能够帮助我如何迭代哈希并删除像两个俱乐部的卡?

deck_of_cards[:two][:clubs]
Run Code Online (Sandbox Code Playgroud)

此代码可以删除一套卡片,但我无法弄清楚如何删除特定的卡片

deck_of_cards.delete_if {|k, v| k == :spades}
Run Code Online (Sandbox Code Playgroud)

tex*_*uce 27

这样做:

deck_of_cards[:clubs].delete(:two)
Run Code Online (Sandbox Code Playgroud)

  • 有什么方法可以完全检索新元素吗?因为此代码返回已删除的元素. (7认同)

Mou*_*mir 7

您可以使用这样的tap功能删除元素并返回原始哈希

deck_of_cards.tap{|d| 
  d[:hearts].tap{|h| 
    h.delete(:two)
  }
}
Run Code Online (Sandbox Code Playgroud)

这将返回deck_if_cards哈希,而不是:两个键

你也可以在一行中完成

    deck_of_cards.tap{|d| d[:hearts].tap{|h| h.delete("two")}}
Run Code Online (Sandbox Code Playgroud)