uzyskanie ostatniej pozycji w obiekcie javascript


96

Jeśli mam obiekt taki jak:

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

Jeśli nie wiem z góry, że lista idzie do 'c', inaczej niż w pętli przez obiekt, czy istnieje sposób na uzyskanie ostatniej pozycji w obiekcie (np. 'carrot')?


To dobre pytanie. Ponadto, w jaki sposób można sprawdzić obiekty pod kątem pustości, poza zapętleniem po nich?
Lukas Eder

2
właściwość, a nie „pozycja”. i nie, porządek własności jest nieokreślony.
bezpłatne konsultacje

ostatnia wartość nieruchomości , którą ma na
myśli,

Odpowiedzi:


67

Nie. Porządek nie jest gwarantowany w JSON i większości innych struktur danych typu klucz-wartość, dlatego ostatnia pozycja może czasami być, carrota innym razem bananai tak dalej. Jeśli musisz polegać na zamawianiu, najlepiej jest wybrać tablice. Siła struktur danych klucz-wartość polega na dostępie do wartości poprzez ich keys, a nie na możliwości uzyskania nthelementu obiektu.


1
Jako rozszerzenie tej całkowicie poprawnej odpowiedzi. Obiekty nie są tablicami, nawet jeśli utworzysz tablicę asocjacyjną w JS za pomocą znaczników tablic, []jest to naprawdę obiekt. JS nie ma tablic asocjacyjnych jako takich, tablice mają indeksowany dostęp i sekwencję; obiekty mają asocjacyjny dostęp do właściwości, niesekwencyjny.
Orbling

3
Wiem, że nie ma gwarancji, że otrzymają kolejność, ale jeśli mam kontrolę nad tworzeniem obiektu, w praktyce mogę upewnić się, że są w określonej kolejności. Oczywiście odpowiedź na to pytanie brzmi jednak „nie”. :)
sprugman

2
@sprugman: Nie w Chrome. Na ten temat toczy się od
Tim Down

225

Tak, jest sposób na użycie Object.keys(obj). Jest to wyjaśnione na tej stronie :

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

Jeśli chcesz uzyskać wartość ostatniego obiektu, możesz to zrobić:

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

8
Ten powinien być zaakceptowany, który Object.keysdziała świetnie. Muszę tylko znaleźć sposób, aby działał na IE8 i 7, ponieważ pojawił się tylko w IE9.
RaphaelDDL,

4
możesz zrobić bezpośrednio z Object.values ​​(fruitObject), który zwróci wartości zamiast kluczy, a następnie wykonać pop () w tablicy, aby zwrócić ostatni element.
Yvon Huynh

4
Pierwsza odpowiedź tutaj jest poprawna. Próbowałem używać Object.keysgo wielokrotnie, aby stwierdzić, że właściwości zostały faktycznie uporządkowane losowo. Rzeczywista kolejność właściwości różni się od tego, co jest wyświetlane po zalogowaniu się do konsoli przeglądarki. Po zalogowaniu się do konsoli przeglądarki właściwości są automatycznie zmieniane i wyświetlane alfabetycznie / numerycznie, co zdecydowanie powoduje pewne zamieszanie.
kennsorr

1
Specyfikacja JS nie gwarantuje kolejności klucza i może się różnić między różnymi implementacjami (silnikami). W związku z tym nie można zagwarantować kolejności reklamowej dla losowo generowanego (kluczowanego) obiektu. Tablica to typ obiektu, w którym klucz jest indeksem numerycznym, aby zagwarantować kolejność wstawiania wśród innych przydatnych właściwości.
Ethan Doh

1
Dobry Boże, ludzie mieli trudności z tworzeniem stron internetowych w latach 2010-2013 ...
Merc

22
last = Object.keys(obj)[Object.keys(obj).length-1];

gdzie obiekt jest twoim obiektem


1
Pobiera ostatni klucz ( 'c'w tym przypadku), ale pytanie jest sformułowane w sposób, który sugeruje, że pytający szuka ostatniej wartości ( 'carrot'). To również tak naprawdę nie dodaje niczego, co nie jest jeszcze objęte odpowiedzią Kristiny Stefanova
bmaupin

14
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";

źródło: http://javascriptweblog.wordpress.com


2
„inne niż przechodzenie przez obiekt”
sprugman

3
Dla tych, którzy potrzebują pierwszego klucza obiektu, mogą postępować zgodnie z powyższą drogą, ale z tym:for (firstProperty in myObj) { break; };
panosru

10

Rozwiązanie wykorzystujące składnię przydziału destrukturyzacji ES6:

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


6

Możesz tego spróbować. To zapisze ostatni element. Tutaj trzeba przekonwertować obj na tablicę. Następnie użyj pop()funkcji tablicowej , która zwróci ostatni element z przekonwertowanej tablicy.

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


5

Jeśli chodzi o kolejność właściwości obiektów w Javascript, podam tylko link do tej odpowiedzi:

Kolejność elementów w pętli „for (… in…)”

Konkretnie:

Wszystkie nowoczesne implementacje ECMAScript wykonują iterację po właściwościach obiektów w kolejności, w jakiej zostały zdefiniowane

Zatem każda inna odpowiedź jest prawidłowa, nie ma oficjalnego gwarantowanego porządku sprzeciwu dotyczącego własności. Jednak w praktyce tak jest (pomijając wszelkie błędy, które w naturalny sposób mogą zepsuć nawet oficjalnie określone zachowanie).

Ponadto faktyczna kolejność wyliczania właściwości obiektów prawdopodobnie zostanie skodyfikowana w przyszłych specyfikacjach EMCAScript.

Jednak w tej chwili nie pisałbym wokół tego kodu, głównie dlatego, że nie ma wbudowanych narzędzi, które pomogłyby w uporządkowaniu właściwości obiektów. Mógłbyś napisać własną, ale w końcu zawsze będziesz przeglądał każdą właściwość obiektu, aby określić jej położenie.

W związku z tym odpowiedź na twoje pytanie brzmi: nie , nie ma innego sposobu niż zapętlenie obiektu.


Jak powiedziałeś, na pewno nie polegałbym na żadnej kolejności wyliczania właściwości obiektów. Po pierwsze, nowe implementacje ECMAScript nie są zobowiązane do przestrzegania tego de facto standardu, więc kod oparty na określonej kolejności nie jest przyszłościowy; ponadto nie wszystkie obecne przeglądarki zachowują się tak samo. Zobacz tę dyskusję w narzędziu do śledzenia błędów Chrome: code.google.com/p/v8/issues/detail?id=164 . Wreszcie, nie spodziewałbym się, że specyfikacja ECMAScript w najbliższym czasie ustandaryzuje to.
Tim Down

5

Jeśli kolejność ma znaczenie, użyj tablicy, a nie literału obiektu.

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

Albo coś w stylu

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

Lub nawet..

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

Nie dictma gwarancji, że klucze są w porządku.


5

Inne odpowiedzi zbytnio mi to komplikują.

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

Możesz też skorzystać z Object.values()metody:

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

0

Mapuj obiekt w JavaScript . To ma już około 3 lat. Ta struktura danych mapy zachowuje kolejność, w jakiej elementy są wstawiane. Dzięki temu odzyskanie ostatniego elementu faktycznie spowoduje wstawienie ostatniego elementu do mapy



0

jeśli masz na myśli dostać ostatni klucz alfabetycznie, możesz (gwarantować):

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'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.