Ini kode JavaScript saya sejauh ini:
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);
Saat ini dibutuhkan item kedua hingga terakhir dalam array dari URL. Namun, saya ingin melakukan pengecekan untuk item terakhir dalam array menjadi "index.html"
dan jika demikian, ambil item ketiga menjadi terakhir.
javascript
arrays
Balexander
sumber
sumber
const [lastItem] = arr.slice(-1)
.pop()
menghapus elemen terakhir yang memodifikasi array asli. Ini tidak sama dengan hanya mengambil nilai itu.Gunakan Array.pop :
Penting : Ini mengembalikan elemen terakhir dan menghapusnya dari array
sumber
Versi pendek dari apa yang diposkan @chaiguy:
Membaca indeks -1
undefined
sudah kembali .EDIT:
Hari-hari ini preferensi tampaknya menggunakan modul dan untuk menghindari menyentuh prototipe atau menggunakan namespace global.
sumber
var lastItem = [3,2,1,5].last();
. NilailastItem
adalah5
.Do NOT modify objects you Do NOT own
. Ini berbahaya karena banyak alasan, seperti 1. Pengembang lain yang bekerja di tim Anda dapat menjadi bingung karena metode ini tidak standar 2.dengan pembaruan apa pun di perpustakaan atau bahkan menggunakan versi ECMAScript yang lebih rendah atau lebih tinggi, ia dapat dengan mudah HILANG!Array.prototype
, tetapi Anda harus menggunakannyaObject.assign(Array.prototype, 'last', { value: function () { … } });
. Kalau tidak, properti akan dihitung.Dua opsi adalah:
atau
Yang pertama lebih cepat, tetapi yang terakhir terlihat lebih bagus
http://jsperf.com/slice-vs-length-1-arr
sumber
Begini cara mendapatkannya tanpa efek pada ARRAY asli
Jika Anda menggunakan pop (), itu akan mengubah array Anda
Tetapi Anda dapat menggunakan ini sehingga tidak berpengaruh pada array asli:
sumber
pop()
Maka tidak perlu untuk itu : lakukan sajaarr.slice(-1)[0]
Cara ES6 "terbersih" (IMO) adalah:
Ini menghindari bermutasi
foo
, seperti.pop()
seharusnya, jika kami tidak menggunakan operator spread.Yang mengatakan, saya suka juga
foo.slice(-1)[0]
solusinya.sumber
.slice(-1)[0]
tetapi lebih lambat. Bisa juga digunakan.slice
Saya lebih suka menggunakan
array.pop()
daripada indeks.dengan cara ini Anda selalu mendapatkan elemen sebelum index.html (menyediakan array Anda telah mengisolasi index.html sebagai satu item). Catatan: Anda akan kehilangan elemen terakhir dari array.
sumber
Saya pikir jika Anda hanya ingin mendapatkan elemen tanpa menghapus, lebih mudah gunakan ini:
Catatan: Jika array kosong (mis.
[]
) Ini akan kembaliundefined
.omong-omong ... saya tidak memeriksa kinerja, tetapi saya pikir lebih sederhana dan bersih untuk menulis
sumber
arr.slice(-1)[0] === arr[arr.length - 1]
), dan b) lambat karena ia menyalinarr
ke array baru (lihat stackoverflow.com/a/51763533/2733244 untuk pengukuran kinerja).const [lastItem] = array.slice(-1);
Array.prototype.slice dengan -1 dapat digunakan untuk membuat Array baru yang hanya berisi item terakhir dari Array asli, Anda kemudian dapat menggunakan Destrukturisasi Assignment untuk membuat variabel menggunakan item pertama dari Array baru.
sumber
Mendapatkan item terakhir dari sebuah array dapat dicapai dengan menggunakan metode slice dengan nilai negatif.
Anda dapat membaca lebih lanjut di sini di bagian bawah.
Menggunakan pop () akan mengubah array Anda, yang tidak selalu merupakan ide yang bagus.
sumber
arr.slice(-1)[0]
, seperti jawaban ini .array[array.length - 1]
jsperf.com/get-last-item-from-array/13Anda dapat menggunakan pola ini ...
Sementara itu berbunyi agak baik, perlu diingat itu menciptakan sebuah array baru sehingga kurang efisien dibandingkan solusi lain tetapi hampir tidak pernah akan dengan hambatan kinerja aplikasi Anda.
sumber
Pertanyaan ini sudah ada sejak lama, jadi saya terkejut bahwa tidak ada yang menyebutkan hanya mengembalikan elemen terakhir setelah
pop()
.arr.pop()
persis seefisienarr[arr.length-1]
, dan keduanya sama kecepatannyaarr.push()
.Karena itu, Anda bisa lolos dengan:
--- DIedit [periksa itu
thePop
bukanundefined
sebelum mendorong] ------ AKHIR EDIT ---
Yang bisa direduksi menjadi ini (kecepatan yang sama [EDIT: tapi tidak aman!]):
Ini dua kali lebih lambat
arr[arr.length-1]
, tetapi Anda tidak perlu mencari-cari indeks. Itu bernilai emas setiap hari.Dari solusi yang saya coba, dan dalam kelipatan Unit Waktu Eksekusi (ETU) dari
arr[arr.length-1]
:[Metode] .............. [ETU 5 elem] ... [ETU 1 juta elem]
Tiga opsi terakhir, TERUTAMA
[...arr].pop()
, menjadi SANGAT jauh lebih buruk karena ukuran array meningkat. Pada mesin tanpa batasan memori mesin saya,[...arr].pop()
mungkin mempertahankan sesuatu seperti rasio 120: 1. Namun, tidak ada yang suka babi sumber daya.sumber
[]
akan diubah menjadi[undefined]
. Anda perlu melindungi backward push denganundefined
cek eksplisit , sesuatu sepertimyPop !== undefined && arr.push(myPop)
Jika seseorang ingin mendapatkan elemen terakhir sekaligus, ia dapat menggunakan
Array#splice()
:Di sini, tidak perlu menyimpan elemen yang terpecah dalam array, dan kemudian sampai ke elemen terakhir. Jika mendapatkan elemen terakhir adalah satu-satunya tujuan, ini harus digunakan.
Catatan: Ini mengubah array asli dengan menghapus elemen terakhirnya. Anggap
splice(-1,1)
sebagaipop()
fungsi yang muncul elemen terakhir.sumber
["hi"]
vs"hi"
.Bagi mereka yang tidak takut untuk membebani prototipe Array (dan dengan cara penghitungan, Anda seharusnya tidak):
sumber
jQuery memecahkan ini dengan rapi:
sumber
Saya biasanya menggunakan underscorejs , dengan itu Anda bisa melakukannya
Bagi saya itu lebih semantik daripada
loc_array.slice(-1)[0]
sumber
Ini lebih banyak seni Javascript jika Anda datang ke sini mencarinya
Dengan semangat jawaban lain yang digunakan
reduceRight()
, tetapi lebih pendek:Itu bergantung pada fakta bahwa, jika Anda tidak memberikan nilai awal, elemen terakhir dipilih sebagai yang awal (periksa dokumen di sini ). Karena panggilan balik hanya mengembalikan nilai awal, elemen terakhir akan menjadi yang dikembalikan pada akhirnya.
Berhati-hatilah karena ini harus dianggap sebagai seni Javascript dan sama sekali tidak seperti cara saya akan merekomendasikan melakukannya, terutama karena itu berjalan dalam waktu O (n), tetapi juga karena itu menyakitkan keterbacaan.
Dan sekarang untuk jawaban yang serius
Cara terbaik yang saya lihat (mengingat Anda menginginkannya lebih ringkas daripada
array[array.length - 1]
) adalah ini:Kemudian gunakan saja fungsinya:
Fungsi ini sebenarnya berguna jika Anda berurusan dengan array anonim seperti yang
[3, 2, 1, 5]
digunakan di atas, jika tidak Anda harus instantiate dua kali, yang akan menjadi tidak efisien dan jelek:Ugh.
Misalnya, inilah situasi di mana Anda memiliki array anonim dan Anda harus mendefinisikan variabel, tetapi Anda bisa menggunakannya
last()
sebagai gantinya:sumber
Hanya menempatkan opsi lain di sini.
Saya menemukan pendekatan di atas lebih bersih dan onliner pendek. Tolong, jangan ragu untuk mencoba yang ini.
Catatan: Ini akan mengubah array asli, jika Anda tidak ingin memodifikasinya, Anda dapat menggunakannya
slice()
Terima kasih @VinayPai untuk menunjukkan ini.
sumber
Berbagai cara untuk menemukan nilai terakhir array dalam javascript
sumber
console.log(arr.reverse()[0])
- selamat, Anda baru saja memodifikasi array asli.Ini adalah opsi terbaik dari sudut pandang kinerja (~ 1000 kali lebih cepat daripada arr.slice (-1)).
sumber
Secara pribadi saya akan menjawab dengan jawaban kuporific / kritzikratzi. Metode array [array.length-1] menjadi sangat jelek jika Anda bekerja dengan array bersarang.
sumber
Dalam proposal ECMAScript Tahap 1 ada saran untuk menambahkan properti array yang akan mengembalikan elemen terakhir: proposal-array-last .
Sintaksis:
Anda bisa menggunakan polyfill .
Penulis proposal: Keith Cirkel ( chai autor)
sumber
Untuk mencegah penghapusan item terakhir dari array asal, Anda dapat menggunakan
Yang paling didukung dari semua browser (ES6)
sumber
Anda dapat menambahkan
last()
fungsi keArray
prototipe.sumber
Apa pun yang Anda lakukan jangan hanya gunakan
reverse()
!!!Beberapa jawaban menyebutkan
reverse
tetapi tidak menyebutkan fakta bahwareverse
memodifikasi array asli, dan tidak (seperti dalam beberapa bahasa atau kerangka kerja lain) mengembalikan salinan.Ini bisa menjadi jenis kode terburuk untuk di-debug!
sumber
[...animals].reverse()
[1,3,4,5,"last"].slice().reverse()[0]
Penghancuran objek ES6 adalah cara lain untuk pergi.
Anda mengekstrak properti panjang dari Array menggunakan perusakan objek. Anda membuat kunci dinamis lain menggunakan kunci yang sudah diekstraksi oleh [length-1] dan menetapkannya untuk bertahan lama , semuanya dalam satu baris.
sumber
Anda bisa menambahkan pengambil properti baru ke prototipe
Array
sehingga dapat diakses melalui semua contohArray
.Getters memungkinkan Anda untuk mengakses nilai pengembalian suatu fungsi sama seperti nilai properti. Nilai kembali dari fungsi tentu saja adalah nilai terakhir dari array (
this[this.length - 1]
).Akhirnya Anda membungkusnya dalam kondisi yang memeriksa apakah
last
-property masihundefined
(tidak ditentukan oleh skrip lain yang mungkin bergantung padanya).Tidak bekerja di IE ≤ 8.
sumber
Array.prototype.last
selaluundefined
? Jika tidak bekerja di bawah Chrome 36Diedit:
Baru-baru ini saya menemukan satu solusi lagi yang sekarang saya pikir merupakan yang terbaik untuk kebutuhan saya:
Dengan definisi di atas yang berlaku sekarang saya dapat mengatakan:
Nama "w" adalah singkatan dari "wrapper". Anda dapat melihat bagaimana Anda dapat dengan mudah menambahkan lebih banyak metode selain 'last ()' ke pembungkus ini.
Saya mengatakan "terbaik untuk kebutuhan saya", karena ini memungkinkan saya untuk dengan mudah menambahkan "metode pembantu" lainnya ke semua tipe bawaan JavaScript. Apa yang terlintas dalam pikiran adalah mobil () dan cdr () dari Lisp misalnya.
sumber
w
fungsi, buat saja fungsi mengembalikan item terakhir.w([1,2,3]).length
tidak terdefinisi.w([1,2,3])[1]
tidak terdefinisi. Tidak tampak seperti pembungkus bagi saya. Dan ada kesalahan sintaksis. Anda memiliki tambahan ';'. Lihat stackoverflow.com/a/49725374/458321 untuk cara menulis pembungkus kelas (kelas SutString) dan menggunakan refleksi untuk mengisi pembungkus itu. Padahal, imho, pembungkusnya terlalu banyak. Lebih baik menggunakan enkapsulasi, seperti yang hampir Anda miliki.return { arr: anArray, last() { return anArray[anArray.length - 1]; } };
. Juga, w terlalu generik. Panggilan adalah ArrayW atau sesuatu.Saya pikir cara termudah dan super tidak efisien adalah:
sumber