Ruby 如何删除散列中的数组

Ruby 如何删除散列中的数组,ruby,hashmap,Ruby,Hashmap,我有一个如下所示的散列: 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]。pop正在删除数组的最后一个元素。请尝试shift。pop正在删除数组的最后一个元素。

我有一个如下所示的散列:

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]。

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

您可以使用transform_值并从数组中的位置选择第二个元素:

请注意,它不会修改我的\u散列,它会返回一个新对象。

您可以使用transform\u值并从数组中的位置选择第二个元素:


请注意,它不会修改我的散列,而是返回一个新对象。

在irb中执行了这一系列步骤。这是假设您想要改变我的\u散列:

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!

在irb中执行了这一系列步骤。这是假设您想要改变我的\u散列:

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!

这可以通过非破坏性的每个_withobject方法完成:

my|hash.每个_与_对象{}{k,v,h{h[k]=v[1]}


如果您使用ruby版本<2.4.0,其中引入了transform_values方法,这可能会有所帮助

这可以通过非破坏性的每个_withobject方法完成:

my|hash.每个_与_对象{}{k,v,h{h[k]=v[1]}


如果您使用ruby版本<2.4.0,其中引入了transform_values方法,这可能会有所帮助

shift返回类似于[[2,3,13]]的值。是的,实际上shift是对双数组进行变异。shift返回从数组中移位的元素,但如果不将其赋值给任何对象,Ruby将忽略它。一些演示代码可以帮助OP可视化它是如何工作的。shift返回类似[[2,3,13]]的内容。是的,实际上shift是在对双数组进行变异。shift返回从数组中移位的元素,但如果不将其赋值,Ruby将忽略它。一些演示代码可以帮助OP可视化它是如何工作的。下面是一种不改变原始哈希的方法:my_hash.mergemy_hash{|*,n | n.last}=>{positions=>[2,3,13]}。我更喜欢@Sebastian的解决方案,但如果有必要支持Ruby 2.4之前的版本,这可能会很有用,因为Ruby 2.4将于5月面世。删除第一个内部数组将导致[[2,3,13]]——您还想展平外部数组吗?或者用它的第二个元素替换外部数组?my_hash['positions']=my_hash['positions'][1]可能就是您要查找的内容–它将它持有的数组的第一个元素分配给键'positions'。有一种方法可以做到这一点,而不必改变原始哈希:my_hash.mergemy_hash{|*,n | n.last}=>{positions=>[2,3,13]}。我更喜欢@Sebastian的解决方案,但如果有必要支持Ruby 2.4之前的版本,这可能会很有用,因为Ruby 2.4将于5月面世。删除第一个内部数组将导致[[2,3,13]]——您还想展平外部数组吗?或者用它的第二个元素替换外部数组?my_hash['positions']=my_hash['positions'][1]可能就是您要查找的内容–它将它所持有的数组的第一个元素分配给键“positions”。