删除数组的前x个条目

时间:2013-07-22 14:07:18

标签: ruby-on-rails ruby

我有一系列项目,我需要删除它的前几个项目。 Ruby Array类中是否有内置函数来执行此操作?我进行了搜索,只找到了,看起来像是非常混乱或低效的方法。

我最喜欢这样的事情:

my_items = [ 'item1', 'item2', 'item3', 'item4' ]
trimmed_items = my_items.delete(y, x) # deleting x entries from index y

4 个答案:

答案 0 :(得分:42)

  

我有一系列项目,我需要删除它的前几个项目。

进行非破坏性删除

Array#drop(x)将为您完成工作。

  

从ary中删除前n个元素并返回数组中的其余元素。如果给出负数,则引发ArgumentError。

my_items = [ 'item1', 'item2', 'item3', 'item4' ]
p my_items.drop(2)
p my_items

# >>["item3", "item4"]
# >>["item1", "item2", "item3", "item4"]

破坏性删除

Array#shift

  

删除self的第一个元素并将其返回(将所有其他元素向下移动一个)。如果数组为空,则返回nil。如果给出数字n,则返回前n个元素(或更少)的数组,就像array.slice!(0,n)那样。

my_items = [ 'item1', 'item2', 'item3', 'item4' ]
my_items.shift(2)
p my_items # => ["item3", "item4"]

答案 1 :(得分:3)

要破坏性地更新my_items,您可以这样做:

my_items.slice!(0, 2)
# => ["item1", "item2"] 
my_items
# => ["item3", "item4"] 

答案 2 :(得分:3)

另一种实现此目的的方法是:使用Array#shift,这在您想要从数组前面删除的值时特别有用。

a = (1..5).to_a
a.shift(2)
a # => [3, 4, 5]

答案 3 :(得分:0)

为了完整起见,我将添加另一种方法来实现“删除数组的前x个条目”,并在不影响原始数组的情况下获取数组的其余元素,这是Enumerable模块中drop的工作方式:

arr = [1,2,3,4,5]
arr - arr[0..2]
 => [4, 5] 
arr
 => [1, 2, 3, 4, 5] 

实际上,[]是切片的别名,如Array文档中所指定:

ary[index] → obj or nil
ary[start, length] → new_ary or nil
ary[range] → new_ary or nil
slice(index) → obj or nil
slice(start, length) → new_ary or nil
slice(range) → new_ary or nil

现在,我已经做出了自己的贡献,我想说的是我更喜欢拖放。

由于drop是Enumerable的实例方法,因此它可以应用于其类实现Enumerable模块的任何对象,包括Array和Hash。因此,它在Enumerable对象上调用。但是,drop返回数组的其余元素。因此它将删除指定的元素并返回其余元素:

[1,2,3,4,5].drop(2)
 => [3, 4, 5] 
{a: 'a', b: 'b', c: 'c'}.drop(2)
 => [[:c, "c"]] 

请注意,无论Enumerable对象如何,返回值都是Array中的其余元素。正如已经回答的那样,原始对象没有发生突变。

shift方法在​​Array中实现,它不是Enumerable对象,因此只能应用于Arrays。 Shift返回从数组中删除的元素,由于它使数组本身发生了变异,因此您仍然可以通过保存数组的变量访问其余元素:

arr = [1,2,3,4,5]
 => [1, 2, 3, 4, 5] 
arr.shift(2)
 => [1, 2] 
arr
 => [3, 4, 5] 

最终,有很多方法可以做到这一点,这取决于您在响应中想要什么以及是否介意数组是否被突变。