2009-05-26 12 views
178

Rozważmy:Pierwsze pierwszy indeks obiektu

var object = { 
    foo: {}, 
    bar: {}, 
    baz: {} 
} 

Jak bym to zrobić:

var first = object[0]; 
console.log(first); 

Oczywiście, że nie działa, ponieważ pierwszy indeks jest nazwany foo, nie 0 .

console.log(object['foo']); 

działa, ale nie wiem, że nazywa się foo. Można go nazwać cokolwiek. Po prostu chcę pierwszy.

Odpowiedz

56

Jeśli kolejność obiektów jest znaczna, należy skorygować swój schemat JSON do przechowywania obiektów w tablicy:

[ 
    {"name":"foo", ...}, 
    {"name":"bar", ...}, 
    {"name":"baz", ...} 
] 

lub może :

[ 
    ["foo", {}], 
    ["bar", {}], 
    ["baz", {}] 
] 

Jak wskazuje Ben Alpert, właściwości obiektów JavaScript są nieuporządkowane, a użytkownik de jest zepsute, jeśli oczekuje się od nich wyliczenia w tej samej kolejności, w jakiej są określone w literale obiektu - nie ma "pierwszej" właściwości.

+5

Nigdy nie widziałem (ja w obj) robić rzeczy w innej kolejności, czy mówisz, że czasami dla (i in obj) będzie kopać rzeczy w innej kolejności ? –

+4

Jest możliwe, że tak będzie. Specyfikacja mówi, że nie musi być wyliczana w określonej kolejności. To prawie oznacza, że ​​kolejność może się zmienić. – PatrikAkerstrand

+5

Większość przeglądarek w tych dniach zachowuje zamówienie reklamowe, ale nie zawsze tak było; nie jest to wymagane przez specyfikację, a istnieją najnowsze wersje Chrome, które nie zachowały zamówienia reklamowego. – Miles

18

Nie ma sposobu na uzyskanie pierwszego elementu, ponieważ "skórki" (obiekty) w JavaScript mają nieuporządkowane właściwości. Najprościej jest przechowywanie kluczy w tablicy:

var keys = ["foo", "bar", "baz"]; 

Następnie używać, aby uzyskać właściwą wartość:

object[keys[0]] 
10

miałem ten sam problem wczoraj. Rozwiązałem to tak:

var obj = { 
     foo:{}, 
     bar:{}, 
     baz:{} 
    }, 
    first = null, 
    key = null; 
for (var key in obj) { 
    first = obj[key]; 
    if(typeof(first) !== 'function') { 
     break; 
    } 
} 
// first is the first enumerated property, and key it's corresponding key. 

nie najbardziej eleganckie rozwiązanie, i jestem pewien, że to może dawać różne wyniki w różnych przeglądarkach (tj specyfikacje mówi, że wyliczenie nie jest wymagane, aby wyliczyć właściwości w taki sam porządek zgodnie z ich definicją). Jednak w moim obiekcie miałem tylko jedną właściwość, więc nie było problemu. Potrzebowałem tylko pierwszego klucza.

+0

Witam @PatrikAkerstrand wcześnie Przypadkowo kliknąłem w dół. Dokonaj jakiejkolwiek zmiany w swoim anwser, aby ją cofnąć. Przepraszam. – rogeriolino

6

Można zrobić coś takiego:

var object = { 
    foo:{a:'first'}, 
    bar:{}, 
    baz:{} 
} 


function getAttributeByIndex(obj, index){ 
    var i = 0; 
    for (var attr in obj){ 
    if (index === i){ 
     return obj[attr]; 
    } 
    i++; 
    } 
    return null; 
} 


var first = getAttributeByIndex(object, 0); // returns the value of the 
              // first (0 index) attribute 
              // of the object ({a:'first'}) 
+0

Prawy dla mojego problemu .... :) –

74

oni nie naprawdę uporządkowane, ale można to zrobić:

var first; 
for (var i in obj) { 
    if (obj.hasOwnProperty(i) && typeof(i) !== 'function') { 
     first = obj[i]; 
     break; 
    } 
} 

.hasOwnProperty() jest ważne, aby zignorować prototypy obiektów.

+0

Wystąpił błąd w powyższym kodzie. Sprawdzian typeof powinien być typeof (i) –

+4

typeof jest operatorem – kixorz

+0

@Napalm miał na myśli błąd w sprawdzanej nazwie zmiennej, a nie składnię. Masz rację, ale wiele osób lubi bracketing dla czytelności. –

198

Jeśli chcesz coś zwięzłą spróbować:

for (first in obj) break; 

alert(first); 

zawinięte jako funkcję:

function first(obj) { 
    for (var a in obj) return a; 
} 
+0

nie działa w imns

+8

Zobacz odpowiedź Łukasza Schafera poniżej, używa metody hasOwnProperty, aby upewnić się, że nie pobierzesz członków prototypu. –

+3

Aby jedna linijka działała we wszystkich przeglądarkach, w tym w IE8 i poniżej, używaj 'for (var key in obj) if (obj.hasOwnProperty (key)) break;' Następnie będziesz chciał użyć zmiennej 'key' – Ally

0

Moje rozwiązanie:

Object.prototype.__index = function(index) 
{ 
    var i = -1; 
    for (var key in this) 
    { 
     if (this.hasOwnProperty(key) && typeof(this[key])!=='function') 
      ++i; 
     if (i >= index) 
      return this[key]; 
    } 
    return null; 
} 
aObj = {'jack':3, 'peter':4, '5':'col', 'kk':function(){alert('hell');}, 'till':'ding'}; 
alert(aObj.__index(4)); 
+12

nice , tylko ... Twój styl kodowania! Co do cholery? te aparaty są wszędzie! –

+2

Czy znasz styl Pythona?Właśnie dodałem nawiasy wyrównane w pionie do stylu Pythona. W każdym razie, "Hell is other people", :-D – diyism

4

podstawie CMSanswer.Nie rozumiem wartość bezpośrednio, zamiast biorę klucz w indeksie i to wykorzystać, aby uzyskać wartość:

Object.keyAt = function(obj, index) { 
    var i = 0; 
    for (var key in obj) { 
     if ((index || 0) === i++) return key; 
    } 
}; 


var obj = { 
    foo: '1st', 
    bar: '2nd', 
    baz: '3rd' 
}; 

var key = Object.keyAt(obj, 1); 
var val = obj[key]; 

console.log(key); // => 'bar' 
console.log(val); // => '2nd' 
276

Tak dla zabawy to działa w JS 1.8.5

var obj = {a: 1, b: 2, c: 3}; 
Object.keys(obj)[0]; // "a" 

ten pasuje ten sam porządek, który widzisz robi

for (o in obj) { ... } 
+17

Cleary najlepszą opcją, chyba że wymagana jest zgodność z backword wieku kamienia. –

+1

100% najlepsza odpowiedź. Jest to najłatwiejszy i najszybszy sposób na zrobienie tego. – Iscariot

+3

Aby wyjaśnić, zgodnie z http://en.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5 nie jest obsługiwany przed IE9. Niestety wiele osób wciąż żyje w epoce kamienia łupanego. – Noremac

12

Korzystanie podkreślenia można użyć _.pairs dostać pierwszy wpis obiekt jako pary kluczy wartości następująco:

_.pairs(obj)[0] 

następnie klawisz byłyby dostępne z dalszym [0] indeksu, wartość z [1]

+0

Działa najlepiej, gdy używany jest plik underscore.js. Właśnie tego potrzebowałem ... Dziękuję, George! – Goldengalaxy

69

ta nie daje się pierwszy jako obiekty javascript są nieuporządkowane, ale to jest w porządku, w niektórych przypadkach.

myObject[Object.keys(myObject)[0]] 
23

na pierwszy klucz obiektu można korzystać

console.log(Object.keys(object)[0]);//print key's name 

dla wartości

console.log(object[Object.keys(object)[0]]);//print key's value 
6

Aby uzyskać pierwszy klucz swojego obiektu

const myObject = { 
    'foo1': { name: 'myNam1' }, 
    'foo2': { name: 'myNam2' } 
} 

const result = Object.keys(myObject)[0]; 

// result will return 'foo1' 
+0

Istnieje już 10 takich odpowiedzi ... – NBeydon

+0

Jaka jest różnica w tej odpowiedzi od odpowiedzi Jacoba? – YakovL

+0

daje pewność świeższego, że ten rodzaj kodu działa doskonale. – Santosh

5

ES6

const [first] = Object.keys(obj) 
Powiązane problemy