【问题标题】:How to delete an array inside a hash如何删除散列中的数组
【发布时间】:2019-11-05 17:29:34
【问题描述】:

我有一个看起来像这样的哈希:

my_hash = {"positions"=>[[2, 3, 13, 56], [2, 3, 13]]}

我想删除散列中的第一个数组:

wanted_hash == {"positions"=> [2, 3, 13]}

我试过了:

wanted_hash = my_hash.values[0].pop

但这会删除错误的数组。我不知道为什么,但它删除了[2,3,13]

【问题讨论】:

  • 这是一种无需改变原始哈希的方法:my_hash.merge(my_hash) { |*,n| n.last } #=> {"positions"=>[2, 3, 13]}。我更喜欢 @Sebastian 的解决方案,但如果需要支持 2.4 之前的 Ruby 版本,这可能会很有用,届时 Hash#transform_values 可能会首次亮相。
  • 删除第一个内部数组会导致[[2, 3, 13]] - 您是否还想要展平外部数组?或者也许用它的第二个元素替换外部数组?

标签: ruby hashmap


【解决方案1】:

pop 正在删除数组的最后一个元素。请改用shift

【讨论】:

  • shift 返回类似 [[2, 3, 13]] 的内容。
  • 是的,确实shift 正在改变双数组
  • shift 返回从数组转移的元素,但如果你不将它分配给任何东西,那么 Ruby 将忽略它。一些演示代码将帮助 OP 可视化它的工作原理。
【解决方案2】:

您可以使用transform_values 并从positions 中的数组中选择第二个元素:

my_hash = {"positions"=>[[2, 3, 13, 56], [2, 3, 13]]}
wanted_hash = my_hash.transform_values { |value| value[1] }
# {"positions"=>[2, 3, 13]}

注意它没有修改my_hash,它返回一个新对象。

【讨论】:

    【解决方案3】:

    在irb中进行了这一系列的步骤。这是假设你想改变 my_hash:

    my_hash = {"positions"=>[[2, 3, 13, 56], [2, 3, 13]]}
    # => {"positions"=>[[2, 3, 13, 56], [2, 3, 13]]} 
    my_hash["positions"].shift
    # => [2, 3, 13, 56] 
    my_hash
    # => {"positions"=>[[2, 3, 13]]} 
    my_hash["positions"].flatten!
    # => [2, 3, 13] 
    my_hash
    # => {"positions"=>[2, 3, 13]} 
    

    所以,归结为:

    my_hash["positions"].shift
    my_hash["positions"].flatten!
    

    【讨论】:

      【解决方案4】:

      这可以通过非破坏性each_with)object 方法来完成:

      my_hash.each_with_object({}) { |(k, v), h| h[k] = v[1]}.

      如果您使用 transform_values 方法),这可能会有所帮助。

      【讨论】:

        猜你喜欢
        • 2014-01-16
        • 2022-01-06
        • 2019-02-24
        • 2017-05-01
        • 2023-03-24
        • 2023-04-10
        • 2023-03-22
        • 2011-08-15
        • 2016-08-03
        相关资源
        最近更新 更多