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

sprugman
źródło
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.

Alex
źródło
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"
Kristina Stefanova
źródło
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

user3282891
źródło
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

Jerzy
źródło
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"

ollazarev
źródło
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]);

Shapon Pal
źródło
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.

MooGoo
źródło
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.

meder omuraliev
źródło
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()]
gdzieś gdzieś
źródło
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
źródło
1

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

Object.values(fruitObject)[Object.values(fruitObject).length - 1]; // "carrot"
AshNaz87
źródło
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

vatsa
źródło
0

Niech objbędzie twoim przedmiotem. Wykonawca:

(_ => _[Object.keys(_).pop()])( obj )
diogowalterdefreitas
źródło
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'
Raphael PICCOLO
źródło