mendapatkan item terakhir dalam objek javascript

96

Jika saya memiliki benda seperti:

{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }

Jika saya tidak tahu sebelumnya bahwa daftar naik ke 'c', selain perulangan melalui objek, apakah ada cara untuk mendapatkan item terakhir di objek (misalnya 'carrot')?

sprugman
sumber
Itu pertanyaan yang bagus. Juga, bagaimana objek dapat diperiksa kekosongannya, selain mengulanginya?
Lukas Eder
2
properti bukan "item". dan tidak, urutan properti tidak ditentukan.
Konsultasi Gratis
properti terakhir nilai yang berarti, saya akan mengatakan
KooiInc

Jawaban:

67

Tidak. Pesanan tidak dijamin di JSON dan sebagian besar struktur data nilai kunci lainnya, jadi oleh karena itu item terakhir terkadang bisa carrotdan di lain waktu dapat bananadan seterusnya. Jika Anda perlu mengandalkan pemesanan, taruhan terbaik Anda adalah menggunakan array. Kekuatan struktur data nilai-kunci terletak pada pengaksesan nilai menurut nilainya keys, bukan pada kemampuan mendapatkan nthitem objek.

Alex
sumber
1
Sebagai perluasan dari jawaban yang sepenuhnya benar ini. Objek bukanlah array, bahkan jika Anda membuat array asosiatif di JS menggunakan penanda array, []itu sebenarnya adalah objek. JS tidak memiliki array asosiatif seperti itu, array memiliki akses dan urutan yang diindeks; objek memiliki akses properti asosiatif, tidak berurutan.
Orbling
3
Saya tahu mereka tidak dijamin memiliki pesanan, tetapi jika saya memiliki kendali atas pembuatan objek, dalam istilah praktis, saya dapat memastikan mereka dalam urutan tertentu. Jelas, jawaban atas pertanyaan itu adalah "tidak". :)
sprugman
2
@sprugman: Tidak di Chrome. Perdebatan sengit yang panjang telah berkecamuk tentang subjek ini: code.google.com/p/v8/issues/detail?id=164
Tim Down
225

Ya, ada cara menggunakan Object.keys(obj). Dijelaskan di halaman ini :

var fruitObject = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
Object.keys(fruitObject); // this returns all properties in an array ["a", "b", "c"]

Jika Anda ingin mendapatkan nilai objek terakhir, Anda dapat melakukan ini:

fruitObject[Object.keys(fruitObject)[Object.keys(fruitObject).length - 1]] // "carrot"
Kristina Stefanova
sumber
8
Yang ini seharusnya yang diterima, itu Object.keysberfungsi dengan baik. Hanya harus menemukan cara untuk membuatnya berfungsi di IE8 dan 7, karena itu hanya muncul di IE9.
RaphaelDDL
4
Anda bisa melakukannya secara langsung dengan Object.values ​​(fruitObject) yang akan mengembalikan nilai sebagai ganti kunci, dan kemudian melakukan pop () ke array Anda untuk mengembalikan elemen terakhir.
Yvon Huynh
4
Jawaban pertama di sini adalah jawaban yang benar. Saya mencoba menggunakan Object.keysberulang kali hanya untuk menemukan bahwa properti sebenarnya dipesan secara acak. Urutan properti sebenarnya berbeda dari apa yang ditampilkan saat login ke konsol browser Anda. Saat masuk ke konsol browser, properti secara otomatis disusun ulang dan ditampilkan menurut abjad / numerik, yang pasti menyebabkan kebingungan.
kennsorr
1
Spesifikasi JS tidak menjamin urutan kunci dan dapat bervariasi antara implementasi yang berbeda (mesin). Oleh karena itu, tidak mungkin menjamin urutan penyisipan untuk objek (kunci) yang dibuat secara acak. Array adalah tipe Object dimana kuncinya adalah indeks numerik untuk menjamin urutan penyisipan di antara properti berguna lainnya.
Ethan Doh
1
Tuan yang baik orang mengalami kesulitan melakukan pengembangan web pada tahun 2010-2013 ...
Merc
22
last = Object.keys(obj)[Object.keys(obj).length-1];

dimana obj adalah objek anda

pengguna3282891
sumber
1
Ini mendapatkan kunci terakhir ( 'c'dalam kasus ini) tetapi pertanyaannya ditulis dengan cara yang menyiratkan bahwa penanya mencari nilai terakhir ( 'carrot'). Ini juga tidak benar-benar menambahkan apa pun yang belum tercakup oleh jawaban Kristina Stefanova
bmaupin
14
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";

sumber: http://javascriptweblog.wordpress.com

George
sumber
2
"selain perulangan melalui objek"
sprugman
3
Bagi mereka yang membutuhkan kunci pertama dari suatu objek dapat mengikuti cara di atas tetapi dengan ini:for (firstProperty in myObj) { break; };
panosru
10

Solusi menggunakan sintaks tugas destrukturisasi ES6:

var temp = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var { [Object.keys(temp).pop()]: lastItem } = temp;
console.info(lastItem); //"carrot"

ollazarev.dll
sumber
6

Anda bisa mencobanya. Ini akan menyimpan item terakhir. Di sini perlu mengubah obj menjadi array. Kemudian gunakan pop()fungsi array yang akan mengembalikan item terakhir dari array yang dikonversi.

var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var last = Object.keys(obj).pop();
console.log(last);
console.log(obj[last]);

Shapon Pal
sumber
5

Adapun urutan properti objek di Javascript, saya hanya akan menautkan ke jawaban ini:

Urutan elemen dalam loop "untuk (… in…)"

Secara khusus:

Semua implementasi modern ECMAScript melakukan iterasi melalui properti objek dalam urutan yang mereka tetapkan

Jadi setiap jawaban lain di sini benar, tidak ada jaminan resmi untuk memesan properti objek. Namun dalam praktiknya ada (kecuali bug yang secara alami dapat mengacaukan bahkan perilaku set-in-stone yang ditentukan secara resmi).

Selanjutnya, urutan pencacahan de-facto properti objek kemungkinan besar akan dikodifikasi dalam spesifikasi EMCAScript di masa mendatang.

Namun, saat ini saya tidak akan menulis kode seputar ini, terutama karena tidak ada alat bawaan untuk membantu menangani pesanan properti objek. Anda dapat menulis milik Anda sendiri, tetapi pada akhirnya Anda akan selalu mengulang setiap properti dalam suatu objek untuk menentukan posisinya.

Dengan demikian, jawaban atas pertanyaan Anda adalah Tidak , tidak ada cara lain selain mengulang-ulang suatu objek.

MooGoo
sumber
Seperti yang Anda katakan, saya pasti tidak akan bergantung pada urutan apa pun untuk pencacahan properti objek. Sebagai permulaan, implementasi ECMAScript baru tidak berkewajiban untuk mengikuti standar de facto ini, jadi kode yang mengandalkan urutan tertentu bukanlah bukti masa depan; juga, tidak semua browser saat ini berperilaku sama. Lihat diskusi ini di pelacak bug Chrome: code.google.com/p/v8/issues/detail?id=164 . Akhirnya, saya tidak berharap spesifikasi ECMAScript menjadi standar dalam waktu dekat.
Tim Down
5

Gunakan larik, bukan literal objek, jika keteraturan itu penting.

list = ['apple', 'banana', 'carrot'];

Atau semacamnya

dict = {
 'a' : ['apple', 'awesome'],
 'b' : ['best friend']
};

Atau bahkan..

dict = [{letter:'a', list:['apple', 'awesome']},{letter:'b', list:['best friend']}];

Kunci untuk dictsama sekali tidak dijamin akan teratur.

meder omuraliev
sumber
5

Jawaban lain membuat saya terlalu rumit.

let animals = {
  a: 'dog',
  b: 'cat',
  c: 'bird'
}

let lastKey = Object.keys(animals).pop()
let lastValue = animals[Object.keys(animals).pop()]
seseorang di suatu tempat
sumber
3
JSArray = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };  
document.write(Object.keys(JSArray)[Object.keys(JSArray).length-1]);// writes 'c'   
document.write(JSArray[Object.keys(JSArray)[Object.keys(JSArray).length-1]]); // writes 'carrot'
Reha Ozenc
sumber
1

Anda juga bisa menggunakan Object.values()metode ini:

Object.values(fruitObject)[Object.values(fruitObject).length - 1]; // "carrot"
AshNaz87
sumber
0

Objek peta di JavaScript . Ini sudah berumur sekitar 3 tahun sekarang. Struktur data peta ini mempertahankan urutan item yang dimasukkan. Dengan mengambil item terakhir ini sebenarnya akan menghasilkan item terbaru yang dimasukkan ke dalam Peta

vatsa
sumber
0

Jadikanlah objobjek Anda. Jalankan:

(_ => _[Object.keys(_).pop()])( obj )
diogowalterdefreitas
sumber
0

jika maksud Anda mendapatkan kunci terakhir menurut abjad, Anda dapat (dijamin):

var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var keys = Object.keys(obj);
keys.sort();
var lastkey = keys.pop() // c
var lastvalue = obj[lastkey] // 'carrot'
Raphael PICCOLO
sumber