Ruby 如何从哈希中返回除第一个键/值对之外的所有元素
我想返回散列中的所有元素,不包括第一个键/值对 我的经验有限,所以我使用的是Ruby 如何从哈希中返回除第一个键/值对之外的所有元素,ruby,Ruby,我想返回散列中的所有元素,不包括第一个键/值对 我的经验有限,所以我使用的是。除了,因为它是非破坏性的 h={a:1,b:2,c:3} #我想回去 h={b:2,c:3} #使用此代码 h、 排除(:a) #或者类似的东西 h.except(:a)将与rails/activesupport一起使用,但它要求您知道密钥的名称 寻址第一个元素更为棘手,因为散列作为一种数据结构,对键值对没有顺序。但好消息是,在ruby(或至少是MRI/YARV)中,哈希确实保持插入顺序,并且在迭代键值对时会反映出来。
。除了,因为它是非破坏性的
h={a:1,b:2,c:3}
#我想回去
h={b:2,c:3}
#使用此代码
h、 排除(:a)
#或者类似的东西
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
请注意,散列的“first”概念有点可疑。Ruby中的Hash
es确实是按插入顺序的,因此在每个平台上的每个实现中都可以依赖它,但一般来说,Hash
的目的是按键查找值,而不是依赖顺序
例如,不能保证:a
将是示例中的第一个键。这完全取决于散列的创建方式以及键的添加顺序
也就是说,有一种方法可以完全满足您的需要:删除可枚举
的第一个n
元素,它的名称就不足为奇了
注意,由于它是一个可枚举的
方法,所以它对哈希
es一无所知,它知道的唯一方法是。因此,它将返回一个数组
,该数组由产生,在散列
的情况下,它是两个元素的[键,值]
对:
h.drop(1)
#=> [[:b, 2], [:c, 3]]
幸运的是,有一种方法可以将两个元素数组
的可枚举
转换为散列
,即:
您可以使用as:
我不喜欢将散列转换为数组,操纵数组,然后将修改后的数组转换回散列,所以我使用了
或
或
对于rails,除了
之外应该可以使用。@SergioTulentsev哦,好吧,我不知道它只适用于rails。非常感谢。它是ActiveSupport的一部分,这意味着默认情况下它存在于Rails中,但是如果你需要ActiveSupport,其他应用程序可以使用它。我喜欢,但它是破坏性的。这主要是迂腐,但这种方法的缺点是,它会迭代散列中的每个键值对,即使您知道块只会在第一次迭代中返回truthy。@Jordan,我试图避免这种情况,但想不出一种(非破坏性的)解决方案不枚举所有键值对。不管怎样,不是所有的解决方案(包括到数组的转换和从数组到散列的转换)都会这样做吗?你有什么想法吗?…但是你知道钥匙的名字:h.first.first
@CarySwoveland:h。除了(h.first.first)
是实心钥匙外
h.drop(1).to_h
#=> { b: 2, c: 3 }
h = {a: 1, b: 2, c: 3}
h.tap(&:shift) # => {:b=>2, :c=>3}
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}