【问题标题】:How to return all elements from hash besides first key/value pair除了第一个键/值对之外,如何从哈希中返回所有元素
【发布时间】:2019-08-22 18:45:05
【问题描述】:

我想返回哈希中的所有元素,不包括第一个键/值对。

我的经验有限,所以我使用的是.except,因为它是非破坏性的。

h = {a: 1, b: 2, c: 3}

# I want to return

h = {b: 2, c: 3}

# using this code

h.exclude(:a)

# or something similar

【问题讨论】:

  • 使用 rails,except 应该可以工作。
  • @SergioTulentsev 哦,好吧,我不知道它只适用于 Rails。谢谢!
  • 它是 ActiveSupport 的一部分,这意味着它默认存在于 Rails 中,但如果您需要 ActiveSupport,其他应用程序可以使用它。

标签: ruby


【解决方案1】:

请注意,Hash 的“第一”概念有点可疑。确实,Ruby 中的 Hashes 是插入顺序的,this is guaranteed by the specification,因此您可以在每个平台上的每个实现中都依赖它,但是一般,@987654328 的目的@是按键查找值,依赖顺序。

例如,不保证:a 将是您示例中的第一个键。这完全取决于Hash 的创建方式以及添加密钥的顺序。

话虽如此,有一个 Enumerable 方法可以完全满足您的要求:删除 Enumerable 的第一个 n 元素,不出所料地命名为 Enumerable#drop

注意,由于它是一个Enumerable 方法,它对Hashes 一无所知,它唯一知道的方法是#each。因此,无论#each 产生什么,它将返回一个Array,在Hash 的情况下,它是一个两个元素的[key, value] 对:

h.drop(1)
#=> [[:b, 2], [:c, 3]]

幸运的是,有一种方法可以将二元素Arrays 的Enumerable 变成Hash,即Enumerable#to_h

h.drop(1).to_h
#=> { b: 2, c: 3 }

【讨论】:

    【解决方案2】:

    h.except(:a) 可以与 rails/activesupport 一起使用,但它要求您知道密钥的名称。

    寻址第一个元素更棘手,因为哈希作为一种数据结构,没有键值对的顺序。但好消息是,在 ruby​​(或至少 MRI/YARV)中,哈希确实保持插入顺序,并且在您迭代键值对时会反映出来。所以你可以这样做:

    pairs = h.to_a # get all KV pairs as an array
    except_first = pairs[1..-1] # discard the first KV pair
    except_first.to_h # make a hash
    

    或者,更简洁

    h.drop(1).to_h
    

    【讨论】:

    • ...但您确实知道密钥的名称:h.first.first
    • @CarySwoveland: h.except(h.first.first) 是一个坚实的WTF-moment
    【解决方案3】:

    您可以使用#shift#tap 作为:

    h = {a: 1, b: 2, c: 3}
    h.tap(&:shift) # => {:b=>2, :c=>3}
    

    【讨论】:

    • 我喜欢,但它具有破坏性。
    【解决方案4】:

    我不喜欢将哈希转换为数组、操作数组、然后将修改后的数组转换回哈希的想法,因此我使用了Hash#reject

    h = {a: 1, b: 2, c: 3}
    

    h.reject { |k,_| k == h.first.first }
      #=> {:b=>2, :c=>3} 
    

    h.reject.with_index { |_,i| i.zero? }
      #=> {:b=>2, :c=>3} 
    

    x = 1
    h.reject { (x -= 1).zero? }
      #=> {:b=>2, :c=>3}
    

    【讨论】:

    • 这主要是迂腐,但这种方法的缺点是它会迭代哈希中的每个键值对,即使您知道该块只会在第一次迭代中返回真值。
    • @Jordan,我试图避免这种情况,但想不出没有枚举所有键值对的(非破坏性)解决方案。一种或另一种方式,不是所有解决方案(包括转换为数组以及从数组转换回哈希)都这样做吗?你有什么想法吗?
    猜你喜欢
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2017-01-23
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多