bir javascript nesnesindeki son öğeyi almak


96

Şunun gibi bir nesnem varsa:

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

Listenin 'c'ye kadar çıktığını önceden bilmiyorsam, nesnede döngü yapmaktan başka, nesnedeki son öğeyi almanın bir yolu var 'carrot'mı (örneğin )?


Bu iyi bir soru. Ayrıca, nesnelerin üzerinde döngü yapmaktan başka boşluk olup olmadığı nasıl kontrol edilebilir?
Lukas Eder

2
özellik "öğe" değil. ve hayır, mülkiyet düzeni tanımsızdır.
Ücretsiz Danışmanlık

demek istediği son mülk değeri
KooiInc

Yanıtlar:


67

No al bu nedenle son öğe bazen olabilir, JSON ve diğer birçok anahtar-değer veri yapılarında garanti edilmez carrotve diğer zamanlarda olması bananavb vb. Eğer varsa gerek sipariş güvenmek, en iyi bahis diziler ile gitmektir. Anahtar-değer veri yapılarının gücü , nesnenin öğesini keyselde edememede değil, değerlere onların tarafından erişilmesinde yatar nth.


1
Bu tamamen doğru cevabın bir uzantısı olarak. Nesneler dizi değildir, JS'de dizi işaretleyicilerini kullanarak ilişkilendirilebilir bir dizi oluştursanız []bile, bu gerçekten bir nesnedir. JS'de bu tür ilişkilendirilebilir diziler yoktur, diziler indekslenmiş erişime ve sıraya sahiptir; nesnelerin sıralı olmayan ilişkisel özellik erişimi vardır.
Orbling

3
Bir düzenin garanti edilmediğini biliyorum, ancak nesnenin yaratılışı üzerinde kontrolüm varsa, pratik anlamda, belirli bir sırada olduklarından emin olabilirim. Açıkçası, sorunun cevabı "hayır" dır. :)
sprugman

2
@sprugman: Chrome'da değil. Bu konu hakkında uzun süredir hararetli bir tartışma devam ediyor: code.google.com/p/v8/issues/detail?id=164
Tim Down

225

Evet, kullanmanın bir yolu var Object.keys(obj). Bu sayfada açıklanmıştır :

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

Son nesnenin değerini almak istiyorsanız, şunu yapabilirsiniz:

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

8
Bu kabul edilmiş olmalıydı, Object.keysharika çalışıyor. IE8 ve 7'de çalışmasını sağlamanın bir yolunu bulmalıyım çünkü bu sadece IE9'da ortaya çıktı.
RaphaelDDL

4
anahtarlar yerine değerleri döndürecek olan Object.values ​​(fruitObject) ile doğrudan yapabilir ve son öğeyi döndürmek için dizinize bir pop () yapabilirsiniz.
Yvon Huynh

4
Buradaki ilk cevap doğru cevaptır. Object.keysSadece mülklerin gerçekten rastgele sipariş edildiğini bulmak için tekrar tekrar kullanmayı denedim . Gerçek özellik sırası, tarayıcı konsolunuzda oturum açıldığında görüntülenenden farklıdır. Tarayıcı konsolunda oturum açıldığında, özellikler otomatik olarak yeniden sıralanır ve alfabetik / sayısal olarak görüntülenir, bu da kesinlikle bazı karışıklıklara neden olur.
kennsorr

1
JS belirtimi, anahtarın sırasını garanti etmez ve farklı uygulamalar (motorlar) arasında değişiklik gösterebilir. Bu nedenle, rastgele oluşturulmuş (anahtarlanmış) nesne için ekleme sırasını garanti etmek mümkün değildir. Dizi, diğer yararlı özellikler arasında ekleme sırasını garanti etmek için anahtarın sayısal indeks olduğu bir Nesne türüdür.
Ethan Doh

1
İyi lord insanlar 2010-2013'te web geliştirme yapmakta zorlandılar ...
Merc



10

ES6'nın yıkıcı atama sözdizimini kullanan çözüm:

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


6

Bunu deneyebilirsin. Bu son öğeyi saklayacaktır. Burada obj'i diziye çevirmeniz gerekiyor. Ardından pop(), dönüştürülen diziden son öğeyi döndürecek dizi işlevini kullanın .

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


5

Javascript'te nesne özelliklerinin sıralanmasına gelince, sadece bu yanıta bağlanacağım:

"For (… in…)" döngüsünde öğeler sırası

Özellikle:

ECMAScript'in tüm modern uygulamaları, tanımlandıkları sırayla nesne özellikleriyle yinelenir

Yani buradaki diğer her cevap doğrudur, mülklere itiraz etmek için resmi garantili bir emir yoktur. Bununla birlikte, pratikte var (resmi olarak belirlenmiş davranışı bile doğal olarak bozabilecek herhangi bir böcek yok).

Ayrıca, nesne özelliklerinin fiili numaralandırma sırasının gelecekteki EMCAScript spesifikasyonlarında kodlanması muhtemeldir.

Yine de, şu anda bunun etrafında kod yazmazdım, çünkü çoğunlukla nesne özellik sırasını ele almaya yardımcı olacak yerleşik araçlar yok. Kendinizinkini yazabilirsiniz, ancak sonunda konumunu belirlemek için her zaman bir nesnedeki her özellik üzerinde döngü yaparsınız.

Sorunuzun cevabı Hayır olduğu için , bir nesnenin içinden geçmekten başka yolu yoktur.


Dediğiniz gibi, nesne özelliği numaralandırması için kesinlikle herhangi bir sıraya güvenmem. Başlangıç ​​olarak, yeni ECMAScript uygulamaları bu fiili standarda uyma yükümlülüğü altında değildir, bu nedenle belirli bir sıraya dayanan kod, geleceğe yönelik değildir; ayrıca, tüm mevcut tarayıcılar aynı şekilde davranmaz. Chrome hata izleyicisindeki bu tartışmaya bakın: code.google.com/p/v8/issues/detail?id=164 . Son olarak, ECMAScript spesifikasyonunun bunu yakın zamanda standartlaştırmasını beklemiyorum.
Tim Down

5

Sıra önemliyse, bir nesne değişmezi değil, bir dizi kullanın.

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

Veya benzeri bir şey

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

Ya da..

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

Anahtarlarının dictsıralı olduğu hiç garanti edilmez.


5

Diğer cevaplar benim için fazla karmaşık.

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

Ayrıca Object.values()yöntemi de kullanabilirsiniz :

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

0

JavaScript'te harita nesnesi . Bu zaten yaklaşık 3 yaşında. Bu harita veri yapısı, öğelerin eklendiği sırayı korur. Bu geri alma ile son öğe aslında Haritaya eklenen son öğe ile sonuçlanacaktır



0

alfabetik olarak son anahtarı almayı kastediyorsanız, şunları yapabilirsiniz (garantili):

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'
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.