配列から最後のアイテムを削除


439

次の配列があります。

var arr = [1,0,2];

最後の要素、つまり2を削除したいと思います。

使用しましたarr.slice(-1);が、値は削除されません。




3
arr.splice(-1,1)は配列[1,0]に戻ります。arr.slice(-1,1)があなたに戻ります[2]
Anja Ishmukhametova

10
arr.slice(0,-1)私にとって最良のソリューションでした
Black Mamba

3
「最後の要素を削除する」とは、要素を配列から削除して配列を保持することを意味する可能性があるため、質問は少しあいまいです(要素を1つ少なくして)。ただし、要素を削除して保持することを意味する場合もあります。最初のケース:splice()、2番目のケース:pop()
thoni56 2018

回答:


516

1
@PrithvirajMitra 1と0を削除しますか?したがって、配列== [2]?
アントン

3
1要素配列では機能しません:[1].splice(-1, 1)=>[1]
Tvaroh

135
これは最善の解決策ではなく、最高のポップ機能です。これではない。
Tommix

6
単独でポップすると、最後の要素の値のみが返されます。私が正しく理解している場合、@ PrithvirajMitraは2つのことを望みます。1)元の配列から最後の要素を削除し、2)その要素を単一の要素配列として返します。つまり[0,1,2] -> [2]、を残し[0,1]ます。その場合[arr.pop()]は、トリックを行います。
ベン・ハル

11
array.pop()修正変更されますarray、しばらくはslice(0, -1)しません。ポップはもちろん高速ですが、必ずしもすべてのニーズに適しているとは限りません。
adelriosantiago 2017

619

JavaScript規約によるArray.prototype.pop()

let fruit = ['apple', 'orange', 'banana', 'tomato'];
let popped = fruit.pop();

console.log(popped); // "tomato"
console.log(fruit); // ["apple", "orange", "banana"]

7
Array.prototype.pop()が最速であるようですjsperf.com/slice-vs-splice-vs-pop/3
Daniel

1
pop()を使用する場合は、配列の最後の項目のみをフィールドに配置する場合を除き、jQuery( '#foo')。val(numbers.pop())を実行しないでください。pop()は、削除された要素を返します。スチュアートが行ったように、最初にnumbers.pop();を行います。次にjQuery( '#foo')。val(numbers)...を実行します
Charles Robertson

4
ベストソリューション+1
MDLARS

2
配列の残りを返すunpop()があると便利です。
eomeroff

2
配列を不変に保ちながらこれを行う方法はありますか?
nayiaw

263

次の.slice()ような方法でこれを行うことができます:

arr.slice(0, -1);    // returns [1,0]

ここにデモがあります:

var arr = [1, 0, 2];
var newArr = arr.slice(0, -1);    // returns [1,0]

console.log(newArr);
$('#div1').text('[' + arr + ']');
$('#div2').text('[' + newArr + ']');
<script src="http://code.jquery.com/jquery.min.js"></script>
<b>Original Array    : </b>
<div id="div1"></div>
<br/>
<b>After slice(0, -1): </b>
<div id="div2"></div>

代わりに:

arr.slice(-1);   // returns [2]

ここにデモがあります:

var arr = [1, 0, 2];
var newArr = arr.slice(-1);    // returns [2]

console.log(newArr);
$('#div1').text('[' + arr + ']');
$('#div2').text('[' + newArr + ']');
<script src="http://code.jquery.com/jquery.min.js"></script>
<b>Original Array    : </b>
<div id="div1"></div>
<br/>
<b>After slice(-1): </b>
<div id="div2"></div>

説明:-

これで、Array.prototype.slice()または簡単なslice()メソッドの基本的な構文は次のとおりです。

arr.slice([begin[, end]])

ここに、

beginパラメータは、アレイ開始からの抽出に0から始まるインデックスです。したがって、次のような場合、上記の例に基づいて言うことができます

arr.slice(0)    // returns [1,0,2]

シーケンスの開始から位置0のすべての配列要素を返します[1,0,2]。同様に、

arr.slice(1)    // returns [0,2]

[0,2]ここでは0が1の位置にあり、その後はすべてになるため、0が返されます。さて、あなたのケースでは、負のインデックスを渡しました。つまり、-1シーケンスの最後からのオフセットを示すbeginパラメータとして。したがって、slice(-1)あなたのケースでは、シーケンスの最後の1つの配列要素を抽出します2上記のデモですでに見たように)。

ここendで、slice()メソッド構文のパラメーターについて説明します。これも、配列からの抽出が終了するゼロベースのインデックスです。したがって、次のような配列があるとします。

var arr = [1, 0, 2, 5, 3, 9];

2,5,3配列の要素だけを取得したいのです。今、2シーケンスの最初からの位置はで2あり、最後の要素3では4です。その位置の前の要素を取得する必要があるため、ここで抽出を終了する必要があります。したがって、slice()ここでは単純にメソッドを実装します

arr.slice(2, 5)    // returns [2,5,3]

あなたの場合、-1endパラメータとして実装しているので、コードは

arr.slice(0, -1)   // returns [1,0]

負のインデックスとしてend、シーケンスの最後からのオフセットを示します。したがって、slice(0,-1)シーケンスの最初の要素から最後から2番目の要素を抽出します。したがって、目的の出力が得られます。私たちもできる

arr.slice(0, 2)    // returns [1,0]

同じ出力が得られます。しかし、私は-1ここのように長い配列でも実装しやすいので使用しました

[0,2,3,1,2,9,3,6,3,9,1,0,2,9,0,1,1,2,3,4,7,9,1]

最後の要素を削除したいだけなら、ここに座って最後の9の位置を計算したくはありませんarr.slice(0, 22)。その後、ここで単純に負のインデックスロジックを実装して実行できます。

arr.slice(0, -1) // same result as arr.slice(0, 22)

それが役に立てば幸い!


11
これはうまく機能します。これが.s p lice()ではなく.slice()への呼び出しであることを確認してください。
ブライアンハスデン2014年

4
このソリューション配列から最後のアイテムを削除せず、その最後のアイテムarrを除外する新しい配列を返すことに注意してください。Mozillaのドキュメントにあるように、「slice()メソッドは、配列の一部の浅いコピーを新しい配列オブジェクトに返します。」
F Lekschas、2015年

4
質問のサンプルコードは、元の配列から最後の値を削除した新しい配列を取得する方法を暗黙的に尋ねています。それarr.slice(0, -1)が最良の答えです。
Tsounabe 2016年

4
スライスは元の配列を変更しないため、優れています
user365314 '29

66

例で学ぶ:

let array_1 = [1,2,3,4];
let array_2 = [1,2,3,4];
let array_3 = [1,2,3,4];

array_1.splice(-1,1)  // output --> [4]      array_1 = [1,2,3]
array_2.slice(0,-1);  // output --> [1,2,3]  array_2 = [1,2,3,4]
array_3.pop();        // output --> 4        array_3 = [1,2,3]

13
これは、ほとんどの問題点を示しているため、受け入れられる答えになるはずです。>あなたが欲しいの配列を返すORあなたが望む方法で配列を変異。
RaisingAgent

1
@RaisingAgentこれらに気づいていただきありがとうございます:)
Lukas Liesis

43

slice元の配列を変更しないため、これを行う必要があります。

arr = arr.slice(-1);

元の配列を変更したい場合は、以下を使用できますsplice

arr.splice(-1, 1);

またはpop

arr.pop();

22

私は.pop()最も「正しい」ソリューションであると考えますが、最後の要素がない配列を使用する必要があるため、うまくいかない場合があります...

そのような場合、以下を使用する必要があるかもしれません、それは戻ります [1,2,3]

var arr = [1,2,3,4];
console.log(arr.splice(0,arr.length-1));

しばらくは.pop()戻ってきます4

var arr = [1,2,3,4];
console.log(arr.pop());

これは望ましくないかもしれません...

これにより時間を節約できることを願っています。


1
おかげで、これは私が使用する必要がある正確な例です。:)
バリーマイケルドイル

2
これが最も正解です。他の人が上位にランク付けしているのは残念です。
mmla 2018年


12

あなたは単に使うことができ、 arr.pop()

これにより、配列の最後のエントリが削除されます。

var arr = [1,0,2]; 
var popped = arr.pop();//Now arr = [1,0] & popped = 2

8

ユースケースには以下を使用してください:

var arr = [1,2,3,4];
arr.pop() //returns 4 as the value
arr // value 4 is removed from the **arr** array variable

ただのメモ。pop()行がポップされたアイテムを返す場合でもfunction を実行すると、元の配列が影響を受け、ポップされた要素が削除されます。


7

あなたはそれを使用して2つの方法でそれを行うことができますsplice()

  1. arr.splice(-1,1)
  2. arr.splice(arr.length-1,1)

splice(position_to_start_deleting, how_many_data_to_delete) 2つのパラメーターを取ります。

position_to_start_deleting:削除を開始するゼロから始まるインデックス。 how_many_data_to_delete:指定されたインデックスから、削除する必要がある連続したデータの数。

pop()as を使用して最後の要素をpop()削除し、配列から最後の要素を削除することもできます。
使用するarr.pop()


6

arr.slice(-1)配列の最後の要素のコピーを返しますが、元の配列は変更されません。

n配列から最後の要素を削除するには、以下を使用しますarr.splice(-n)( "splice"の "p"に注意)を使用します。戻り値は、削除された要素を含む新しい配列になります。

より単純ですがn == 1val = arr.pop()


5
var arr = [1,0,2];
arr.length--; 

//最後の要素を削除します// arr.length> 0かどうかを確認する必要があります


5

このメソッドは、配列の最後の要素を削除して保存するのに役立ちます。

var sampleArray = [1,2,3,4];// Declaring the array
var lastElement = sampleArray.pop();//this command will remove the last element of `sampleArray` and stores in a variable called `lastElement` so that you can use it if required.

結果は次のとおりです。

console.log(sampleArray); //This will give you [1,2,3]
console.log(lastElement); //this will give you 4

この答えとどう違うのですか?
mpaskov 2016年

確かにそうですが、これはもっと複雑です。あなたの答えは初心者には理解しにくいです。
razat naik 2016

3

splice(index、howmany)-このソリューションは良さそうです。しかし、この方法は正の配列インデックスに対してのみ機能します。最後の2つのアイテムまたは3つのアイテムを削除するには、インデックス自体を使用します。

たとえば、splice(-2)は最後の2つのアイテムを削除します。最後の3つの項目を削除するためのsplice(-3)。


3

slice両方が新しい配列を返す一方.pop().splice()既存の配列を変更することは注目に値します配列ます。

チェーンされたコマンドスタイルでデータのコレクションを処理したい場合は、sliceこのようなものを使い続けたいと思うでしょう。

例えば:

myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

var newArrayOfThings = myArray
  .filter(x => x > 5)              // only bigly things
  .slice(-1)                       // get rid of the last item
  .map(x => `The number is: ${x}`);// map to a set of strings

"pop"を使用して同じ種類のことを行うにはmapfilterや、などとは異なり、新しい配列を取得できないため、いじりの変更と変数の管理が必要になる場合があります。

これpushは、配列の最後に項目を追加すると同じようなものです。それはあなたがconcat流れを続けることを可能にするので、あなたはより良いものになるかもしれません。

myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

var newArrayOfThings = myArray
  .filter(x => x > 5)              // only bigly things
  .slice(-1)                       // get rid of the "10"
  .concat([100])                   // note with concat, you must pass an array
  .map(x => `The number is: ${x}`) // map to a set of strings
  


3

Lodashでは、どの要素が削除されたかを気にしない場合、dropRightを使用できます。

_.dropRight([1, 2, 3])
// => [1, 2]

_.dropRight([1, 2, 3], 2);
// => [1]

3
var a = [1,2,3,4,5,6]; 
console.log(a.reverse().slice(1).reverse());
//Array(5) [ 1, 2, 3, 4, 5 ]

このコードは質問に答えることがありますが、問題を解決する方法や理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
Vasilisa

3

2019 ECMA5ソリューション:

const new_arr = arr.reduce((d, i, idx, l) => idx < l.length - 1 ? [...d, i] : d, [])

非破壊的で汎用的なワンライナーで、配列の最後にコピーと貼り付けが必要なだけです。


1
「非破壊的」は、元の質問が望んでいるようには聞こえませんI would like to remove the last element 。これには、元の配列に対する破壊的/変更操作が必要です。
Ben Hull、


1

これは最後のアイテムを削除する良い方法です:

if (arr != null && arr != undefined && arr.length > 0) {
      arr.splice(arr.length - 1, 1);
}

次としてスプライスの詳細:

splice(startIndex、スプライスの数)


1
var stack = [1,2,3,4,5,6];

stack.reverse().shift();

stack.push(0);

出力はArray [0,1,2,3,4,5]になります。これにより、新しい値をプッシュするのと同じ量の配列要素を保持できます。


シフト後またはプッシュ後に再び正しい順序を取得するには、別のリバースが必要です
cyptus

逆は、元の配列を逆にします。私を見つけた... 1度か2度言ってみましょう...
Simon_Weaver

1

別のアプローチは、インデックスに基づいてフィルタリングすることです:

arr.filter((element, index) => index < arr.length - 1);

注:filter()新しい配列を作成しますが、既存の配列は変更しません。


0

JavaScriptの配列の最後からn項目を削除する場合は、簡単に使用できます。

arr.splice(-n, n);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.