Bir dizideki son öğeyi al


1142

JavaScript kodum şu ana kadar:

var linkElement = document.getElementById("BackButton");
var loc_array = document.location.href.split('/');
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-2]))); 
linkElement.appendChild(newT);

Şu anda dizideki ikinci ile son öğeyi URL'den alıyor. Ancak, dizideki son öğe için bir kontrol yapmak istiyorum "index.html"ve eğer öyleyse, bunun yerine üçüncü son öğe almak.

Yanıtlar:


1225
if (loc_array[loc_array.length - 1] === 'index.html') {
   // do something
} else {
   // something else
}

: Sunucu da kullanabilirsiniz "index.html" ve "index.html" için aynı dosyayı vermektedir durumunda .toLowerCase().

Yine de, mümkünse bu sunucu tarafını yapmayı düşünebilirsiniz: daha temiz olacak ve JS'si olmayan kişiler için çalışacaktır.


1051

Bir dezavantaj olup olmadığından emin değilim, ancak bu oldukça özlü görünüyor:

arr.slice(-1)[0] 

veya

arr.slice(-1).pop()

undefinedDizi boşsa her ikisi de geri döner .


31
yıkım kullanarak da güzel:const [lastItem] = arr.slice(-1)
diachedelic

@diachedelic bu en şık yol! Müthiş!
Trufa

1
.pop()orijinal diziyi değiştiren son öğeyi kaldırır. Bu değeri elde etmekle aynı şey değildir.
Badrush

3
@Badrush slice (), tek bir öğenin kopyasını içeren yeni bir dizi oluşturur ve pop yalnızca bu kopyayı değiştirir. orijinal dizi zarar görmeden kalır
kritzikratzi

Ancak bu kod sık çağrılmadığı sürece yeni diziler oluşturmaktan kaçınmalısınız. Aksi takdirde, çöp toplamaya fazladan bir yük bindirir ve / veya tarayıcının daha fazla bellek kullanmasını sağlar.
mvmn

259

Array.pop kullanın :

var lastItem = anArray.pop();

Önemli : Bu son öğeyi döndürür ve kaldırır diziden onu


165

@Chaiguy'un gönderdiği şeyin daha kısa bir sürümü:

Array.prototype.last = function() {
    return this[this.length - 1];
}

-1 dizinini okumak undefinedzaten geri döner .

DÜZENLE:

Bu günlerde tercih modülleri kullanıyor ve prototipe dokunmaktan veya global bir ad alanı kullanmaktan kaçınmak gibi görünüyor.

export function last(array) {
    return array[array.length - 1];
}

8
Bu, gerçek kullanılacaksa değil nasıl açıktır, burada bir örnek: var lastItem = [3,2,1,5].last();. Değeri lastItemIS 5.
user128216

7
Bu cevap doğru ve aynı zamanda oldukça temiz AMA (!!!) Javascript kullanarak bir başparmak kuralıdır Do NOT modify objects you Do NOT own. Bu gibi birçok nedenden dolayı tehlikelidir. Ekibinizde çalışan diğer geliştiriciler bu yöntem standart olmadığı için karışabilir 2. kütüphanelerde herhangi bir güncelleme ile veya daha düşük veya daha yüksek bir ECMAScript sürümü kullanarak kolayca KAYBOLABİLİR!
Farzad YZ

1
Merak eden herkes için, bu Array.forEach () 'ı kırar. Hala prototipleri değiştirmenin en kötü şey olmadığını kabul ediyorum, ama bu kötü.
Seph Reed

1
Imo modifikasyonda çok büyük bir sorun yok Array.prototype, ama kullanmalısın Object.assign(Array.prototype, 'last', { value: function () { … } });. Aksi takdirde mülk numaralandırılacaktır.
雨伞 雨伞


70

Orijinal ARRAY üzerinde hiçbir etkisi olmadan nasıl elde edeceğiniz aşağıda açıklanmıştır

a = [1,2,5,6,1,874,98,"abc"];
a.length; //returns 8 elements

Pop () kullanırsanız , dizinizi değiştirir

a.pop();  // will return "abc" AND REMOVES IT from the array 
a.length; // returns 7

Ancak bunu , orijinal dizi üzerinde hiçbir etkisi olmayacak şekilde kullanabilirsiniz :

a.slice(-1).pop(); // will return "abc" won't do modify the array 
                   // because slice creates a new array object 
a.length;          // returns 8; no modification and you've got you last element 

6
dilim (-1) .pop () yapmalısınız, aksi takdirde tüm diziyi kopyalarsınız (gerçekten yalnızca son öğeyi kopyalamanız gerekir).
kritzikratzi

O pop()zaman buna gerek yok : sadece yaparr.slice(-1)[0]
Christophe Marois

56

"En temiz" ES6 yolu (IMO) şöyle olur:

const foo = [1,2,3,4];
const bar = [...foo].pop();

Bu , yayılma operatörünü kullanmadığımız foogibi mutasyona uğramasını önler .pop().
Yani foo.slice(-1)[0]çözümü de seviyorum .


1
Daha fazla yapmak için dizi yıkımını da kullanabilirsiniz ES6;) stackoverflow.com/a/46485581/31671
alex

36
Bu çözümün tüm dizinin bir kopyasını gerçekleştirdiğini unutmayın.
Brendan Annable

4
O kadar okunmaz .slice(-1)[0]ama daha yavaş. Might as well use.slice
fregante

12
Tüm diziyi yalnızca "temiz" sözdizimi için kopyalamak bana aptalca geliyor. O güzel görünmesi bile doesnt
Jemar Jones

43

array.pop()Dizinlerden çok kullanmayı tercih ederim .

while(loc_array.pop()!= "index.html"){
}
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length])));

bu şekilde öğeyi her zaman index.html'den önce alırsınız (dizinizin tek bir öğe olarak izole index.html olması şartıyla). Not: Yine de dizideki son öğeleri kaybedersiniz.


38

Sadece kaldırmadan öğeyi almak istiyorsanız, daha basit olduğunu düşünüyorum:

arr.slice(-1)[0]

Not: Dizi boşsa (örn. []) Bu geri döner undefined.

bu arada ... performansı kontrol etmedim, ama bence yazmak daha basit ve temiz


A) bunun son değeri döndürmediğini, ancak son öğeye ( arr.slice(-1)[0] === arr[arr.length - 1]) sahip bir dizi ve b) yavaş olduğunu unutmayın, çünkü arryeni bir diziye kopyalanır ( performans ölçümü için bkz. Stackoverflow.com/a/51763533/2733244 ).
wortwart

33

const [lastItem] = array.slice(-1);

-1 ile Array.prototype.slice , yalnızca orijinal Dizinin son öğesini içeren yeni bir Dizi oluşturmak için kullanılabilir, daha sonra yeni Dizinin ilk öğesini kullanarak bir değişken oluşturmak için Yıkıcı Atama'yı kullanabilirsiniz .

const lotteryNumbers = [12, 16, 4, 33, 41, 22];
const [lastNumber] = lotteryNumbers.slice(-1);

console.log(lotteryNumbers.slice(-1));
// => [22]
console.log(lastNumber);
// => 22


30

Bir dizinin son öğesinin elde edilmesi, negatif değerlere sahip dilim yöntemi kullanılarak elde edilebilir .

Bununla ilgili daha fazla bilgiyi aşağıda bulabilirsiniz .

var fileName = loc_array.slice(-1)[0];
if(fileName.toLowerCase() == "index.html")
{
  //your code...
}

Pop () kullanılması dizinizi değiştirecektir, bu her zaman iyi bir fikir değildir.


1
Dilim bir dizi döndürür, ancak bu cevaparr.slice(-1)[0] gibi kullanın .
Cees Timmerman

4
Performans bir array[array.length - 1] sorunsa
Bruno Peres

29

Bu kalıbı kullanabilirsiniz ...

let [last] = arr.slice(-1);

Oldukça güzel okur da, diğer çözümlere göre daha az verimli ama o olmak neredeyse bu sayede hiç yeni bir dizi oluşturur akılda tutmak uygulamanızın performansını darboğaz.


25

Bu soru uzun zamandır var, bu yüzden hiç kimsenin sadece son elementi a pop().

arr.pop()kadar verimli arr[arr.length-1]ve her ikisi de aynı hızdaarr.push() .

Bu nedenle, aşağıdakilerle kurtulabilirsiniz:

--- DÜZENLENDİ [ itmeden önce thePopolmadığını kontrol edin undefined] ---

let thePop = arr.pop()
thePop && arr.push(thePop)

--- SON DÜZENLEME ---

Bu azaltılabilir (aynı hız [EDIT: ama güvensiz!]):

arr.push(thePop = arr.pop())    //Unsafe if arr empty

Bu iki kat daha yavaştır arr[arr.length-1], ancak bir dizinle uğraşmanıza gerek yoktur. Her gün altın değerinde.

Denediğim çözümlerden ve Yürütme Süresi Biriminin (ETU) katları arr[arr.length-1]:

[Yöntem] .............. [ETU'lar 5 elem] ... [ETU 1 milyon elem]

arr[arr.length - 1]      ------> 1              -----> 1

let myPop = arr.pop()
arr.push(myPop)          ------> 2              -----> 2

arr.slice(-1).pop()      ------> 36             -----> 924  

arr.slice(-1)[0]         ------> 36             -----> 924  

[...arr].pop()           ------> 120            -----> ~21,000,000 :)

Son üç seçenek, [...arr].pop()özellikle dizinin boyutu arttıkça ÇOK daha da kötüleşir. Makinemin bellek sınırlaması olmayan bir makinede, [...arr].pop()muhtemelen 120: 1 oranı gibi bir şeyi korur. Yine de hiç kimse bir kaynak domuzunu sevmiyor.


3
İlk dizi boşsa, bu yaklaşım yanlış sonuçlanır ve []dönüştürülür [undefined]. Sen açık olan geriye itmek korumak için gereken undefinedçek, gibi bir şeymyPop !== undefined && arr.push(myPop)
dhilt

23

Eğer bir kişi en son unsuru bir seferde elde etmek istiyorsa kullanabilir Array#splice():

lastElement = document.location.href.split('/').splice(-1,1);

Burada, bölünmüş öğeleri bir dizide saklamanıza ve ardından son öğeye gitmenize gerek yoktur. Eğer son elementi almak tek hedef ise, bu kullanılmalıdır.

Not: Bu , son diziyi kaldırarak orijinal diziyi değiştirir . Son öğeyi açan splice(-1,1)bir pop()işlev olarak düşünün .


5
Bu, son öğenin kendisi yerine bir dizideki son öğeyi döndürmez mi?

2
@tozazaburo aynı şey değil mi?
Aram Kocharyan

5
bu diziyi değiştirir. orijinal diziye dokunulmadan bırakmak için splice (-1) yerine dilim (-1) kullanabilirsiniz. Değil, karşılaştırmak onun hayır @AramKocharyan ["hi"]vs "hi".
kritzikratzi

20

Array prototipini aşırı yüklemekten korkmayanlar (ve numaralandırma maskelemesi ile olmamalısınız):

Object.defineProperty( Array.prototype, "getLast", {
    enumerable: false,
    configurable: false,
    writable: false,
    value: function() {
        return this[ this.length - 1 ];
    }
} );



18

Eğer buraya gelmek için geldiysen daha fazla Javascript sanatı var

Kullanılan reduceRight(), ancak daha kısa başka bir cevap ruhu içinde :

[3, 2, 1, 5].reduceRight(a => a);

Başlangıç ​​değeri girmemeniz durumunda, ilk öğenin ilk öğe olarak seçildiği gerçeğine dayanır ( burada dokümanları kontrol edin ). Geri arama yalnızca ilk değeri döndürmeye devam ettiğinden, son öğe sonunda döndürülecek olan öğe olacaktır.

Bunun Javascript sanatı olarak kabul edilmesi gerektiğini unutmayın ve çoğunlukla O (n) zamanında çalıştığı için değil, aynı zamanda okunabilirliği de bozduğu için bunu yapmayı tavsiye edeceğim.

Ve şimdi ciddi cevap için

Gördüğüm en iyi yol (daha özlü olmasını istediğinizi düşünerek array[array.length - 1]) şudur:

const last = a => a[a.length - 1];

Sonra sadece işlevi kullanın:

last([3, 2, 1, 5])

İşlev aslında [3, 2, 1, 5]yukarıda kullanılan gibi anonim bir dizi ile uğraşıyorsanız faydalıdır , aksi takdirde iki kez başlatmanız gerekir, bu da verimsiz ve çirkin olur:

[3, 2, 1, 5][[3, 2, 1, 5].length - 1]

Ugh.

Örneğin, anonim bir diziniz olduğu ve bir değişken tanımlamanız gereken bir durum, ancak last()bunun yerine şunları kullanabilirsiniz :

last("1.2.3".split("."));

16

Buraya başka bir seçenek koymak.

loc_array.splice(-1)[0] === 'index.html'

Yukarıdaki yaklaşımı daha temiz ve kısa onliner buldum. Lütfen, bunu denemek için çekinmeyin.

Not: Orijinal diziyi değiştirir, değiştirmek istemiyorsanız kullanabilirsiniz slice()

loc_array.slice(-1)[0] === 'index.html'

@VinayPai bunu işaret ettiğiniz için teşekkürler .


Tarafından yorumuna göre stackoverflow.com/users/510036/qix-monica-was-mistreated Bu yazı üzerine stackoverflow.com/questions/9050345/... de ve testler jsperf.com/last-array-element2 son derece yavaş olduğunu
Subash

13

Javascript'te bir dizinin son değerini bulmanın birden çok yolu

  • Orijinal diziyi etkilemeden

var arr = [1,2,3,4,5];

console.log(arr.slice(-1)[0])
console.log(arr[arr.length-1])
const [last] = [...arr].reverse();
console.log(last)
console.log(arr.reverse()[0])

  • Orijinal diziyi değiştirir

var arr = [1,2,3,4,5];

console.log(arr.pop())
arr.push(5)
console.log(...arr.splice(-1));

  • Kendi yardımcı yöntemini oluşturarak

let arr = [1, 2, 3, 4, 5];

Object.defineProperty(arr, 'last', 
{ get: function(){
  return this[this.length-1];
 }
})

console.log(arr.last);


"Orijinal diziyi etkilemeden" ve önerilen şekilde yaparak ilk örneğiniz varsa : console.log(arr.reverse()[0]) - tebrikler, orijinal diziyi değiştirdiniz.
Roko C. Buljan

12
const lastElement = myArray[myArray.length - 1];

Bu, performans açısından en iyi seçenektir (arr diliminden (-1) ~ 1000 kat daha hızlı).


10

Şahsen ben kuporific / kritzikratzi'nin cevabını iptal ediyorum. İç içe dizilerle çalışıyorsanız dizi [array.length-1] yöntemi çok çirkinleşir.

var array = [[1,2,3], [4,5,6], [7,8,9]]

array.slice(-1)[0]

//instead of 

array[array.length-1]

//Much easier to read with nested arrays

array.slice(-1)[0].slice(-1)[0]

//instead of

array[array.length-1][array[array.length-1].length-1]


10

Başlangıç ​​öğesinden son öğenin kaldırılmasını önlemek için kullanabilirsiniz

Array.from(myArray).pop()

Çoğunlukla tüm tarayıcılarda desteklenir (ES6)


1
100.000 veya daha fazla element içeren büyük dizilerle iyi şanslar.
Soldeplata Saketos

9

Prototife bir last()işlev ekleyebilirsiniz Array.

Array.prototype.last = function () {
    return this[this.length - 1];
};

9

Ne yaparsanız yapın sadece kullanmayın reverse()!!!

Birkaç cevap , orijinal diziyi değiştiren ve (diğer bazı dillerde veya çerçevelerde olduğu gibi) bir kopya döndürmediğinden reversebahsetmez reverse.

var animals = ['dog', 'cat'];

animals.reverse()[0]
"cat"

animals.reverse()[0]
"dog"

animals.reverse()[1]
"dog"

animals.reverse()[1]
"cat"

Bu hata ayıklamak için en kötü kod türü olabilir!


4
Dizinizin ters çevrilmiş bir kopyasını almak istiyorsanız, şimdi yayma işlecini kullanabilirsiniz. ör.[...animals].reverse()
Josh R

tersi kullanmadan önce diziyi kopyalayabilirsiniz[1,3,4,5,"last"].slice().reverse()[0]
Madeo

9

ES6 nesnesini yok etmek başka bir yol.

const {length, [length-1]: last}=[1,2,3,4,5]
console.log(last)

Sen ayıklamak uzunluk nesne strüktür kullanarak Array malını. [Length-1] tarafından daha önce ayıklanmış anahtarı kullanarak başka bir dinamik anahtar oluşturursunuz ve sonuna bir satırda atayacak şekilde atarsınız .


biraz zor ama zeki.
Adrien Castagliola

Teşekkürler, Tam olarak ne yaptığını açıklayabilir misiniz?
Tarun Nagpal

8

Yeni bir mülk alıcısı ekleyebilirsiniz . bir prototipArray o tüm örneklerini erişilebilir olması için Array.

Getters, bir işlevin dönüş değerine, tıpkı bir özelliğin değeriymiş gibi erişmenizi sağlar. İşlevin dönüş değeri elbette dizinin ( this[this.length - 1]) son değeridir .

Son olarak, last-property'nin hala olup olmadığını kontrol eden bir koşula sarıyorsunuz undefined(buna güvenebilecek başka bir komut dosyası tarafından tanımlanmadı).

if(typeof Array.prototype.last === 'undefined') {
    Object.defineProperty(Array.prototype, 'last', {
        get : function() {
            return this[this.length - 1];
        }
    });
}

// Now you can access it like
[1, 2, 3].last;            // => 3
// or
var test = [50, 1000];
alert(test.last);          // Says '1000'

IE work 8 ile çalışmaz.


Array.prototype.lasther zaman undefined? Chrome 36 altında çalışmıyorsa
bryc

7

REDAKTE:

Son zamanlarda ihtiyaçlarım için en iyisi olduğunu düşündüğüm bir çözüm daha buldum:

function w(anArray) {
  return {
    last() {
      return anArray [anArray.length - 1];
    };
  };
}

Yukarıdaki tanımın yürürlüğe girmesiyle artık şunu söyleyebilirim:

let last = w ([1,2,3]).last();
console.log(last) ; // -> 3

"W" adı " sarmalayıcı" anlamına gelir. Bu sarmalayıcıya 'last ()' öğesinin yanı sıra nasıl daha fazla yöntem ekleyebileceğinizi kolayca görebilirsiniz.

"İhtiyaçlarım için en iyisi" diyorum, çünkü bu herhangi bir JavaScript yerleşik türüne kolayca bu tür "yardımcı yöntemler" eklememe izin veriyor. Akla gelen, örneğin Lisp arabası () ve cdr ().


Neden bir sarıcı kullanmalıyım? Bir wişlevi çağırmanız gerekiyorsa , işlevin son öğeyi döndürmesini sağlayın.
fregante

w([1,2,3]).lengthtanımsız. w([1,2,3])[1]tanımsız. Bana bir sarıcı gibi görünmüyor. Ve bir sözdizimi hatası var. Fazladan bir ';' var. Sınıf sarmalayıcı (SutString sınıfı) yazma ve bu sarmalayıcıyı doldurmak için yansıma kullanma hakkında bilgi için stackoverflow.com/a/49725374/458321 adresine bakın . Rağmen, imho, sarmalayıcılar aşırı. Kapsüllemeyi kullanmak daha iyidir, tıpkı neredeyse sahip olduğunuz gibi. return { arr: anArray, last() { return anArray[anArray.length - 1]; } };. Ayrıca, w çok genel. Çağrı ArrayW falan.
TamusJRoyce

6

Bence en kolay ve süper verimsiz yol:

var array = ['fenerbahce','arsenal','milan'];
var reversed_array = array.reverse(); //inverts array [milan,arsenal,fenerbahce]
console.log(reversed_array[0]) // result is "milan".

43
Bu çözüm O (n) daha fazla bellek alır ve O (n) zaman alır. Gerçekten ideal bir çözüm değil.
hlin117
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.