24

アイテムの配列があり、その最初の x 個のアイテムを削除する必要があります。Ruby Array クラスにこれを行う組み込み関数はありますか? 私は周りを検索しましたが、信じられないほど面倒で非効率的な方法のように見えるものしか見つかりませんでした.

私はできれば次のようなものが欲しいです:

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

4 に答える 4

56

アイテムの配列があり、その最初の 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 の最初の要素を削除して返します (他のすべての要素を 1 つ下にシフトします)。配列が空の場合は nil を返します。数値 n が指定された場合、array.slice!(0, n) と同様に、最初の n 個の要素 (またはそれ以下) の配列を返します。

my_items = [ 'item1', 'item2', 'item3', 'item4' ]
my_items.shift(2)
p my_items # => ["item3", "item4"]
于 2013-07-22T14:09:41.720 に答える
3

破壊的に更新my_itemsするには、次のようにします。

my_items.slice!(0, 2)
# => ["item1", "item2"] 
my_items
# => ["item3", "item4"] 
于 2013-07-22T14:11:04.383 に答える
1

完全を期すために、「配列の最初の x エントリの削除」を実現し、元の配列に影響を与えずに配列の残りの要素を取得する別の方法を追加します。これは、Enumerable モジュールでのドロップの仕組みです。

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

実際、配列のドキュメントで指定されているように、 [] はスライスのエイリアスです。

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 のインスタンス メソッドであるため、Array や Hash など、Enumerable モジュールを実装するクラスを持つ任意のオブジェクトに適用できます。したがって、Enumerable オブジェクトで呼び出されます。ただし、drop は配列の残りの要素を返します。したがって、指定された要素を削除し、残りを返します。

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

Enumerable オブジェクトに関係なく、戻り値は配列の残りの要素であることに注意してください。回答がすでに述べているように、元のオブジェクトは変更されていません。

shift メソッドは Array に実装されており、Enumerable オブジェクトではないため、Array にのみ適用できます。Shift は配列から削除された要素を返します。配列自体を変更したため、配列を保持する変数を介して残りの要素に引き続きアクセスできます。

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

最終的に、これを行うには多くの方法があり、応答に何を求めているか、および配列が変更されているかどうかを気にするかどうかによって異なります。

于 2018-10-12T23:34:25.800 に答える