删除数组的前x个元素

25
我有一个项数组,需要删除前x个项目。Ruby Array类中是否有内置函数可以完成此操作?我搜索了一下,只找到了非常混乱或低效的方法。
我更想要像这样的东西:
my_items = [ 'item1', 'item2', 'item3', 'item4' ]
trimmed_items = my_items.delete(y, x) # deleting x entries from index y
4个回答

60

我有一个项目数组,需要删除它的前 x 个项目。

使用非破坏性的方式进行删除

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
好的,谢谢。当SO允许我的时候,我会将其标记为答案。 - Alexander Forbes-Reed

4
另一种实现方法:使用Array#shift,在你想要移除数组前面的值时特别有用。
a = (1..5).to_a
a.shift(2)
a # => [3, 4, 5]

3
为了破坏性更新“my_items”,你可以执行以下操作:
my_items.slice!(0, 2)
# => ["item1", "item2"] 
my_items
# => ["item3", "item4"] 

啊,原来是这样!相比于普通的切片,它的工作方式是这样的,谢谢。 - Alexander Forbes-Reed

1
为了完整起见,我将添加另一种方法来实现“删除数组的前x个条目”并获取剩余元素的数组,而不影响原始数组,这就是在Enumerable模块中使用drop的方式:
arr = [1,2,3,4,5]
arr - arr[0..2]
 => [4, 5] 
arr
 => [1, 2, 3, 4, 5] 

事实上,[]是slice的别名,正如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 and shift”。
由于“drop”是可枚举模块(Enumerable)的一个实例方法,因此它可以应用于任何实现了可枚举模块的类的对象,包括数组(Array)和哈希表(Hash)。因此,它是在可枚举对象上调用的。但是,“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对象,因此只能应用于数组。Shift返回从数组中删除的元素,并且由于它改变了数组本身,您仍然可以通过保存数组的变量访问剩余的元素:
arr = [1,2,3,4,5]
 => [1, 2, 3, 4, 5] 
arr.shift(2)
 => [1, 2] 
arr
 => [3, 4, 5] 

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接