2008-10-07 6 views
35

Potrzebuję uzyskać tylko pierwszy element (właściwie tylko pierwszy klucz) z dość dużej tablicy asocjacyjnej w JavaScript. Oto jak ja to robię obecnie (przy użyciu jQuery):Jaki jest najskuteczniejszy sposób uzyskania pierwszego elementu z tablicy asocjacyjnej w JavaScript?

getKey = function (data) { 
    var firstKey; 
    $.each(data, function (key, val) { 
     firstKey = key; 
     return false; 
    }); 
    return firstKey; 
}; 

tylko zgadywać, ale powiedziałbym, że musi być lepszy (czytaj: bardziej wydajne) sposób to zrobić. Jakieś sugestie?

AKTUALIZACJA: Dzięki za wnikliwe odpowiedzi i komentarze! Zapomniałem mojego JavaScript 101, w którym specyfikacja mówi, że nie ma gwarancji określonej kolejności w tablicy asocjacyjnej. Interesujące jest jednak to, że większość przeglądarek implementuje je w ten sposób. Wolałbym nie sortować tablicy przed uzyskaniem pierwszego klucza, ale może to być nieuniknione, biorąc pod uwagę mój przypadek użycia.

+0

Jeśli jest to tablica asocjacyjna, skąd wiadomo, jaki jest pierwszy element? –

+0

Myślę, że oznacza on pierwszy element, który został wstawiony do tablicy. –

+0

Jeśli chcesz, musisz zbudować własną implementację stosu. Tablice Assoc nie zachowują żadnego porządku. –

Odpowiedz

41

Nie jest naprawdę ostatni elementem asocjacyjnych (czyli obiektów) pierwszy lub . Jedynym zamówieniem, które możesz zdobyć, jest kolejność, w której elementy zostały zapisane przez analizator składni - i nie ma gwarancji, że będzie to zgodne.

Ale jeśli chcesz pierwszym wymyślić, klasyczny sposób w rzeczywistości może być nieco łatwiejsze:

function getKey(data) { 
    for (var prop in data) 
    return prop; 
} 

Chcesz uniknąć właściwości dziedziczenia?

function getKey(data) { 
    for (var prop in data) 
    if (data.propertyIsEnumerable(prop)) 
     return prop; 
} 
+7

Faktycznie masz zagwarantowane zamówienie - nie według specyfikacji, ale po prostu ze względu na zbyt wiele stron w zależności od zamówienia w przeszłości. Zasadniczo masz gwarancję, że dla (a in b) .. obejmie każdą przeliczalną własność w b w dokładnej kolejności, w jakiej zostały dodane do obiektu w czasie wykonywania. – olliej

+2

(zabrakło mi miejsca powyżej) Wyjątkiem jest kolejność wyliczania właściwości w łańcuchu prototypów, który wciąż zmienia się od przeglądarki do przeglądarki. – olliej

+4

Co jest nie tak z 'Object.keys (data) [0]'? – cprn

2

Oprócz rozwiązania Jonathana, możemy również rozszerzyć funkcjonalność domyślne tablicy:

Array.prototype.getKey = function() { 
    for (var prop in this) 
    if (this.propertyIsEnumerable(prop)) 
     return prop; 
} 
41

można uniknąć konieczności tworzenia funkcję poprzez odwołanie pierwszy wpis zwrócony z Object.keys():

var firstKey = Object.keys(data)[0]; 

Dla pierwszego wpisu z posortowanej listy kluczy, po prostu dodaj połączenie do metody .sort():

var firstKey = Object.keys(data).sort()[0]; 
+1

jest to najlepszy, który myślę ... +1! – Riad

+4

Jeśli potrzebujesz wsparcia dla starszych przeglądarek, pamiętaj o włączeniu tej polyfill do skryptu: https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys – 10basetom