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')?


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.


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"

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


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


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"


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]);


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.


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.


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()]

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'

1

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

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

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



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'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.