Diziden son öğeyi kaldır


441

Aşağıdaki dizi var.

var arr = [1,0,2];

Son elemanı yani 2 kaldırmak istiyorum.

Kullandım arr.slice(-1);ama değeri kaldırmıyor.




3
arr.splice (-1,1) dizisine [1,0] dönecektir; arr.slice (-1,1) size geri dönecek [2]
Anja Ishmukhametova

10
arr.slice(0,-1)benim için en iyi çözümdü
Black Mamba

3
"Son öğeyi kaldır" öğenin diziden kaldırılması ve dizinin (bir öğenin daha az olduğu) tutulması anlamına gelebileceği için soru biraz belirsizdir. Ancak, öğeyi kaldırmak ve öğeyi tutmak anlamına da gelebilir. İlk vaka: splice()İkinci vaka: pop().
thoni56

Yanıtlar:


517

Ek yeri kullan (dizin, howmany)

arr.splice(-1,1)

1
@PrithvirajMitra 1 ve 0'ı kaldırmak istiyor musunuz? Yani dizi == [2]?
Anton

3
Tek elemanlı diziler için çalışmaz: [1].splice(-1, 1)=>[1]
Tvaroh

135
Bu en iyi çözüm DEĞİL, En iyi pop işlevidir. Bu değil.
Tommix

6
Kendi kendine pop sadece son elemanın değerini döndürür. Doğru anlarsam, @PrithvirajMitra iki şey ister: 1) Son öğeyi orijinal diziden kaldırmak ve 2) bu öğeyi tek bir öğe dizisi olarak döndürmek - yani: [0,1,2] -> [2]geride bırakmak [0,1]. Bu durumda, o [arr.pop()]zaman hile yapacağız.
Ben Hull

11
Not array.pop()ise Modifiye değişecek arrayiken, slice(0, -1)olmaz. Pop elbette daha hızlıdır, ancak tüm ihtiyaçlar için her zaman uygun olmayabilir.
adelriosantiago

621

JavaScript kurallarına göre 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 () en hızlı jsperf.com/slice-vs-splice-vs-pop/3 gibi görünüyor
Daniel

1
Pop () kullanırken, dizinin yalnızca son öğesini alana yerleştirmek istemiyorsanız, jQuery ('# foo'). Val (numbers.pop ()) yapmadığınızdan emin olun. pop (), kaldırılan öğeyi döndürür. Stuart'ın yaptığı gibi, önce numbers.pop (); ve sonra jQuery ('# foo') yapın. val (sayılar) ...
Charles Robertson

4
En iyi çözüm +1
Mdlars

2
dizinin geri kalanını döndüren unpop () öğesine sahip olmak harika olurdu.
eomeroff

2
Diziyi değişmez tutarken bunu yapmanın herhangi bir yolu var mı?
nayiaw

263

Bunu aşağıdaki .slice()gibi bir yöntemle yapabilirsiniz :

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

İşte bir demo:

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>

yerine:

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

İşte bir demo:

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>

Açıklama: -

Şimdi Array.prototype.slice()ya da kısaca slice()yöntemin temel sözdizimi :

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

Buraya,

beginparametresi bir dizi başlatma gelen olan ekstraksiyon sıfır tabanlı endeksidir. Yani, yukarıdaki örneğe dayanarak,

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

tüm dizi öğelerini sıranın başlangıcından 0 konumundan başlayarak döndürür [1,0,2]. Benzer şekilde, yaparsak

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

[0,2]0 burada 1. konumda olduğundan ve bundan sonraki her şeyden dönecektir . Şimdi, sizin durumunuzda negatif bir indeks geçtiniz, yani, -1start parametresi olarak, dizinin sonundan itibaren bir ofseti gösterir. Yani, slice(-1)sizin durumunuzda dizideki son bir dizi öğesini çıkarır ve bu 2( yukarıdaki demoda daha önce gördüğümüz gibi) ).

Şimdi, burada yöntem sözdizimindeki endparametre hakkında konuşalım slice(). Yine, bir diziden çıkarmanın sona erdiği sıfır tabanlı bir dizindir. Diyelim ki şöyle bir dizimiz var: -

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

ve 2,5,3dizideki elemanları almak istiyoruz . Şimdi, 2dizinin başlangıcından itibaren konumu 2ve son eleman 3için öyle 4. Öğeyi bu konumdan önce almamız gerektiğinden ekstraksiyonu burada bir konum 5'e sonlandırmamız gerekecek. Yani, slice()burada sadece

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

Sizin durumunuzda, -1end parametresi olarak uyguladık , bu nedenle kodumuz şöyle

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

Negatif bir dizin olarak, enddizinin sonundan itibaren bir ofseti belirtir. Böylece, slice(0,-1)ilk öğeyi dizideki ikinci-son öğeden ayıklar. Böylece, istenen çıktıyı elde ederiz. Biz de yapabiliriz

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

Aynı çıktıyı alacağız. Ancak, -1burada uzun bir dizi için bile uygulanması daha kolay olarak kullandım

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

Sadece son elemanı kaldırmak istiyorsanız, burada ve sonuncunun son 9 pozisyonunu hesaplamak istemezsiniz arr.slice(0, 22). Daha sonra, negatif dizin mantığını buraya uygulayabilir ve

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

Umarım yardımcı olur!


11
Bu harika çalışıyor, bunun .s p lice () değil, .slice () çağrısı olduğunu fark ettiğinizden emin olun .
Brian Hasden

4
Bu çözümün son öğeyi diziden kaldırmadığı , arrbunun yerine son öğeyi hariç tutan yeni bir dizi döndürdüğü unutulmamalıdır. Mozilla'nın belgelerinde dediği gibi: "slice () yöntemi, bir dizinin bir kısmının sığ bir kopyasını yeni bir dizi nesnesine döndürür."
F Lekschas

4
Sorunun örnek kodu, örtük olarak orijinal diziden son değeri kaldırılmış yeni bir dizinin nasıl alınacağını sorar. Yani arr.slice(0, -1)iyi cevaptır.
Tsounabe

4
orijinal diziyi değiştirmediğinden dilim daha iyidir
user365314

66

örnekle öğren:

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
En çok neyin yanlış gittiğini gösterdiği için kabul edilen cevap bu olmalıdır . > İstediğiniz diziyi döndürmek VEYA diziyi istediğiniz şekilde değiştirmek.
RaisingAgent

1
@RaisingAgent Bunları fark ettiğiniz için teşekkürler :)
Lukas Liesis

43

sliceOrijinal diziyi değiştirmediği için bunu yapmanız gerekir .

arr = arr.slice(-1);

Orijinal diziyi değiştirmek isterseniz şunları kullanabilirsiniz splice:

arr.splice(-1, 1);

veya pop:

arr.pop();

22

.pop()En 'doğru' çözüm olarak düşünürdüm , ancak bazen son öğe olmadan dizi kullanmanız gerektiğinden işe yaramayabilir ...

Böyle bir durumda aşağıdakileri kullanmak isteyebilirsiniz, [1,2,3]

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

süre .pop()dönecekti 4:

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

bu istenmeyebilir ...

Umarım bu size biraz zaman kazandırır.


1
Teşekkürler ahbap, bu kullanmam gereken tam örnek. Bunu takdir ediyorum :)
Barry Michael Doyle

2
Bu en doğru cevap. Diğerleri daha yüksek sırada yer alan bir utanç.
mmla


12

Sadece kullanabilirsiniz, arr.pop()

Bu, dizinin son girişini kaldırır.

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

8

Kullanım durumunuz için aşağıdakileri kullanmanız yeterlidir:

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

Sadece bir not. pop()Satır açılan öğeyi döndürse bile işlevi yürüttüğünüzde orijinal dizi etkilenir ve açılan öğe kaldırılır.


7

Bunu kullanarak iki şekilde yapabilirsiniz splice():

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

splice(position_to_start_deleting, how_many_data_to_delete) iki parametre alır.

position_to_start_deleting: Silmeye başlanacağı yerden sıfır temelli dizin. how_many_data_to_delete: Belirtilen dizinden, ardışık kaç verinin silinmesi gerektiği.

Ayrıca kullanarak son öğe kaldırabilirsiniz pop()olarak pop()bazı diziden uzaklaşmaların son öğe.
kullanımarr.pop()


6

arr.slice(-1)dizinin son öğesinin bir kopyasını döndürür , ancak orijinal diziyi değiştirmeden bırakır.

nBir dizideki son öğeleri kaldırmak için şunu kullanın:arr.splice(-n) ("ek" içindeki "p" yi not edin). Dönüş değeri, kaldırılan öğeleri içeren yeni bir dizi olacaktır.

n == 1Kullanım için henüz daha basitval = arr.pop()


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

// son öğeyi kaldırır // arr.length> 0 olup olmadığını kontrol etmeniz gerekir


5

Bu yöntem, bir dizinin son öğesini silmek ve depolamak için daha yararlıdır.

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.

Şimdi sonuçlar:

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

Bu cevabın farkı nedir?
mpaskov

Bu doğru ama bu daha ayrıntılı. Yeni başlayanlar için cevabınızı anlamak zor.
razat naik

4

Belirterek It yetmeyecek slicehem dönecektir yeni dizi, oysa .pop()ve .splice()dönüşecek mevcut diziyi.

Zincirleme komut stiline sahip veri koleksiyonlarını işlemeyi seviyorsanız, slice seviyorsanız, bunun gibi bir şeye bağlı kalmak .

Örneğin:

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

Bunun aksine map, "pop" ile aynı şeyi yapmak için çok daha fazla karışıklık ve değişken yönetim gerektirebilir.filter vb, yeni bir dizi geri alamadım.

pushBir dizinin sonuna bir öğe ekleyen aynı şey . concatAkışı devam ettirmenize izin verdiği için daha iyi olabilirsiniz .

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

splice (index, howmany) - Bu çözüm kulağa hoş geliyor. Ancak bu howmany sadece pozitif dizi endeksi için çalışacaktır. Son iki veya üç öğeyi kaldırmak için dizinin kendisini kullanın.

Örneğin, son iki öğeyi kaldırmak için ekleme (-2) yapın. son üç öğeyi çıkarmak için ekleme (-3).



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

Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden çözüldüğüne dair ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
Vasilisa

3

2019 ECMA5 Çözümü:

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

Tahribatsız, genel, tek astarlı ve sadece dizinizin sonunda bir kopyala yapıştır gerektirir.


1
'Sigara yıkıcı' orijinal soru istediği gibi gelmiyor: I would like to remove the last element . Bu, orijinal dizide yıkıcı / mutasyona uğrayan bir işlem gerektirir.
Ben Hull

2

söyle var var arr = [1,0,2]

arr.splice(-1,1)sana array [1,0];dönecekken arr.slice(-1,1)sana dönecekarray [2];


1

Bu, son öğeyi kaldırmak için iyi bir yoldur:

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

Splice detay aşağıdaki gibi:

splice (startIndex, splice sayısı)


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

stack.reverse().shift();

stack.push(0);

Çıktı: Dizi [0,1,2,3,4,5] olacaktır . Bu, yeni bir değeri içeri aktarırken aynı sayıda dizi öğesini korumanıza izin verir.


vardiyadan sonra veya tekrar doğru siparişi almak için itme işleminden sonra başka bir tersine ihtiyacın var
cyptus

Tersi orijinal diziyi tersine çevirir. Beni yakaladı ... bir ya da iki kez diyelim ...
Simon_Weaver

1

Diğer bir yaklaşım da indekse göre filtrelemektir:

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

Not: filter()yeni dizi oluşturur, mevcut diziyi değiştirmez.


0

Javascript'teki dizinin sonundan n öğeyi kaldırmak istiyorsanız, şunları kullanabilirsiniz:

arr.splice(-n, n);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.