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'
)?
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'
)?
Odpowiedzi:
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ć, carrot
a innym razem banana
i 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 nth
elementu obiektu.
[]
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.
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"
Object.keys
działa świetnie. Muszę tylko znaleźć sposób, aby działał na IE8 i 7, ponieważ pojawił się tylko w IE9.
Object.keys
go 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.
last = Object.keys(obj)[Object.keys(obj).length-1];
gdzie obiekt jest twoim obiektem
'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
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";
for (firstProperty in myObj) { break; };
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"
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]);
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.
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 dict
ma gwarancji, że klucze są w porządku.
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()]
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'
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
Niech obj
będzie twoim przedmiotem. Wykonawca:
(_ => _[Object.keys(_).pop()])( obj )
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'