[JS] tablica asocjacyjna

0

Moim pytaniem jest jak można odwołać się do ostatniego elementu tablicy asocjacyjnej nie znając klucza. Coś w stylu var a =tablica[tablica.length-1]; dla zwykłej tablicy.

na razie wymyśliłem coś takiego:

var tablica = { "Ala" : "kot", "Pi" : 3.1415  ..... };
var i;
for(var j in tablica){i=j;}
var a= tablica[i];

no ale takie coś wymaga przejścia przez całą tablice i jestem pewien że da się to zrobić prościej ;]

2

Teoretycznie to w ogóle się tego nie da się tego zrobić, tj. nie da się zagwarantować pobrania ostatnio zdefiniowanej własności w obiekcie. W ECMAScripcie (JS to pochodna ECMAScriptu) obiekty to zbiory własności bez określonej kolejności (ang. unordered). Specyfikacja nie gwarantuje, że pętla for-in będzie iterowała się przez własności w kolejności ich zdefinowania w obiekcie.

W praktyce implementacje prawie zawsze tak właśnie robią. Wyjątki raczej nie powinny Cię tutaj ugryźć, choć zwróć uwagę na Operę i Chrome (w Chromie mieli to "naprawić" -- nie pamiętam, czy już naprawili).

Zwróć proszę uwagę, że taka pętla for-in, jaką masz, będzie też iterowała przez własności dodane do prototypu obiektu, po którym iterujesz. W tym przypadku prototypem jest Object.prototype. Jeśli ktoś stworzy własność powiedzmy Object.prototype.foobar, to ta pętla for-in przeiteruje się również po własności foobar. Żeby uniknąć iterowania po własnościach prototypów i uwzględnić tylko "własne" własności obiektów, trzeba użyć hasOwnProperty, jak poniżej:

for (var j in tablica) {
  if (tablica.hasOwnProperty(j)) {
    i = j;
  }
}

Wracając do tego, co chcesz zrobić. W nowszych wersjach JavaScriptu dostępna jest funkcja Object.keys(ob) zwracającą nazwy wszystkich własności własnych (przepraszam za masło maślane) obiektu ob, które byłyby uwzględnione przez pętlę for-in (więcej info: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys). Object.keys zwraca tablicę, więc mógłbyś łatwo odnieść się do ostatniej własności tej tablicy.

Tyle że Object.keys to raczej przyszłość niż teraźniejszość i obecnie ciężko z kompatybilnością, praktycznie nie da się tego używać.

Pozostaje chyba napisać własną funkcję korzystającą z for-in, albo użyć jakiejś funkcji napisanej już przez kogoś innego (np. biblioteka Prototype udostępnia taką metodę).

0

Tylko pytanie, jaka różnica jest między obiektem { "Ala" : "kot", "Pi" : 3.1415 ..... } a {"Pi" : 3.1415,"Ala" : "kot" ..... }; ? Z praktycznego punktu widzenia żadna :) Bo do właściwości odnosisz się np. obiekt.Ala albo obiekt.Pi i nie ma znaczenia gdzie ta Ala i to Pi się znajduje, czy na początku, czy na końcu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1