2009-07-12 10 views
16

Czy istnieje sposób na uzyskanie nazwy pierwszej właściwości obiektu JSON?Pierwsze właściwości JSON

chciałbym zrobić coś takiego:

var firstProp = jsonObj[0]; 

edit: Dostaję obiekt JSON kategorie wich luku tablic z adresami URL obrazu.

tak:

{ 
    "category1":["image/url/1.jpg","image/url/2.jpg"], 
    "category2":["image/url/3.jpg","image/url/4.jpg"] 
} 

ja wtedy iteracja obiektu wstawić obrazy, a ja naprawdę chciałem to elegancki sposób, aby zobaczyć jakiej kategorii został wprowadzony jako pierwszy. W pierwszej chwili po prostu nie

for (var cat in images) { 
    if (i==0) firstCat = cat; 
    ... 
} 

Ale jak niektórzy „czuł” brzydki ... Tak było w zasadzie tylko kwestia elegancji: p

+1

Nie możesz używać tablicy zamiast? – Gumbo

+0

dupe: http: // stackoverflow.com/questions/909003/javascript-getting-the-first-index-of-an-object/909044 # 909044 – Miles

Odpowiedz

28

Kolejność właściwości obiektu nie jest gwarantowana, aby była taka sama jak sposób ich umieszczania. W praktyce jednak wszystkie główne przeglądarki zwracają je w kolejności. Więc jeśli jesteś w porządku z opierając się na tym ...

var firstProp; 
for(var key in jsonObj) { 
    if(jsonObj.hasOwnProperty(key)) { 
     firstProp = jsonObj[key]; 
     break; 
    } 
} 

Należy również pamiętać, że istnieje bug in Chrome dotyczące zamawiania, w niektórych przypadkach krawędzi nie zamówić go w sposób, w jaki zostały dostarczone. O ile zmieni się w przyszłości, szanse są naprawdę niewielkie, ponieważ uważam, że staje się to częścią standardu, więc jeśli cokolwiek na to poprzeć, stanie się tylko oficjalne.

Wszystkie rzeczy uważane za ważne, jeśli naprawdę, naprawdę, absolutnie, pozytywnie, chcesz mieć pewność, że będzie w odpowiedniej kolejności, musisz użyć tablicy. W przeciwnym razie powyższe jest w porządku.

Powiązane pytanie: Elements order - for (… in …) loop in javascript

+0

Ale co, jeśli to się zmieni w przyszłości? –

+1

Wystarczy napisać, że kolejność wyliczania właściwości obiektu nie dotarła do specyfikacji ECMAScript 5, Chrome zachował szybkie działanie, a teraz inne przeglądarki podążają za nim, więc obawy @ the_drow były uzasadnione. –

2

Świetne pytanie. Nie wiem w żaden sposób poza iteracją w pętli for-in. Musisz jednak tylko raz powtórzyć. Ze względów bezpieczeństwa upewnij się, że jest to znana właściwość [more info].

for (var propName in jsonObj) { 
    if (jsonObj.hasOwnProperty(propName)) { 
     return propName; // or do something with it and break 
    } 
} 

Zmieniano być bardzo jasne, że jesteś iteracji nad nazwami własności, a nie ich wartości.

14

Nie ma "pierwszej" właściwości. Właściwości obiektu są nieuporządkowane.

Możesz uzyskać wszystko, co silnik JS zdecyduje się najpierw udostępnić z pętlą.

function maybe_first_in_object(ob) { 
    for (var props in ob) { 
     return prop; 
    } 
} 

& hellip; ale jeśli kolejność ma znaczenie, użyj tablicy, a nie obiektu.

+1

To dobrze, że nie ma gwarancji, że jest to kolejność, w której zostały określone - w przegłosowaniu. Upewnię się jednak, by sprawdzić hasOwnProperty(). –

+0

Otrzymuję obiekt JSON, więc tablice nie są tak naprawdę opcją ... – peirix

+1

Errrrrrrr ......... {data: [1,2,3,4]} – Quentin

1

Przy użyciu jQuery, można również użyć $.each iteracyjne nad obiekt JSON. IMO wygląda czystsze niż przy użyciu for -loop

var items = { 
    'item1': 'content', 
    'item2': 'content', 
    'item3': 'content' 
} 

$.each(items, function() { 
    console.log($(this)[0]) 
}) 
17
console.log(jsonObj[Object.keys(jsonObj)[0]]); 
+0

Byłoby lepiej napisać małe wyjaśnienie, dlaczego tak jest i dlaczego twój jest lepszy od innych. –

+0

Jak rozumiem, Object.keys (jsonObj) utworzy tablicę kluczy obiektu, do których można uzyskać dostęp za pomocą notacji []. [0] to pierwszy element w tablicy. Dodanie tego jako kluczowy odnośnik dla jsonObject (w jego własnych nawiasach kwadratowych) zasadniczo mówi to; "utwórz tablicę wszystkich kluczy w obiekcie, podaj mi pierwszą z nich, teraz wyszukaj wartości tego klucza w oryginalnym obiekcie". – Squidinker

+0

Naprawdę lubię ten jeden lepiej – Rikku121