Uzyskiwanie pierwszego indeksu obiektu


201

Rozważać:

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

Jak miałbym to zrobić:

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

Oczywiście to nie działa, ponieważ pierwszy indeks ma nazwę foo, a nie 0.

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

działa, ale nie wiem, czy to się nazywa foo. Można to nazwać dowolną. Chcę tylko pierwszy.

Odpowiedzi:


61

Jeśli kolejność obiektów jest znacząca, należy zmienić schemat JSON, aby przechowywać obiekty w tablicy:

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

albo może:

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

Jak zauważa Ben Alpert, właściwości obiektów JavaScript są nieuporządkowane, a kod jest uszkodzony, jeśli spodziewasz się, że będą one wyliczane w tej samej kolejności, w jakiej zostały określone w literale obiektu - nie ma właściwości „pierwszej”.


6
Nigdy nie widziałem, aby (i in obj) robiły rzeczy w innej kolejności, czy mówisz, że czasami dla (i in obj) wykopie rzeczy w innej kolejności?
Ryan Florence

4
Możliwe, że tak będzie. Specyfikacja mówi, że nie musi być wyliczana w określonej kolejności. To prawie oznacza, że ​​ta kolejność może ulec zmianie.
PatrikAkerstrand

5
Obecnie większość przeglądarek zachowuje porządek wstawiania, ale nie zawsze tak było; nie jest to wymagane przez specyfikację, a były najnowsze wersje Chrome, które nie zachowały kolejności wstawiania.
Mil

1
Gdy zagłębiłem się w to, co robiłem, kolejność rzeczy stawała się coraz ważniejsza (myślałem, że zależy mi tylko na pierwszym, ale się myliłem!), Więc było jasne, aby przechowywać moje obiekty w tablicy, jak sugerowałeś.
Ryan Florence

1
Jeśli wiesz, że obiekt ma tylko jeden element, znasz kolejność.
danorton

329

Dla zabawy działa to w JS 1.8.5

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

Jest to zgodne z tą samą kolejnością, którą zobaczysz

for (o in obj) { ... }

24
Wyczyść najlepszą opcję, chyba że wymagana jest kompatybilność słów kluczowych z epoki kamienia.
Dag Sondre Hansen

1
100% najlepsza odpowiedź. To najłatwiejszy i najszybszy sposób na zrobienie tego.
Sprawa

3
Dla wyjaśnienia, zgodnie z en.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5 nie jest obsługiwany przed IE9. Niestety wiele osób jest jeszcze w epoce kamienia łupanego.
Noremac,

Świetny Krótkie i proste. Dzięki @Jacob
Sariban D'Cl

jeśli ktoś używa IE9 - czuję jego ból. dzięki, to jest niesamowite
CMS

204

Jeśli chcesz czegoś zwięzłego, spróbuj:

for (first in obj) break;

alert(first);

opakowane jako funkcja:

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

8
Zobacz odpowiedź Luke'a Schafera poniżej, używa on metody hasOwnProperty, aby mieć pewność, że nie złapiesz prototypowych elementów.
Code Commander

3
Aby jedna linijka działała we wszystkich przeglądarkach, w tym IE8 i niższych, użyj for (var key in obj) if (obj.hasOwnProperty(key)) break;: Będziesz wtedy chciał użyć keyzmiennej
Ally

nie działa, jeśli pierwszy element jest typem obiektu. zwraca 0
śnieg

Object.keys(obj)[0];jest znacznie szybszy (0,072 ms) niż for(1,644 ms).
Sebastian Ortmann

77

nie są tak naprawdę uporządkowane, ale możesz 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ć prototypowe obiektów.


W powyższym kodzie występuje błąd. Sprawdzanie typu powinno być typof (i)
jacob.toye

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

Dziękuję Ci. To niesamowite.
Santosh

76

Nie da ci to pierwszego, ponieważ obiekty javascript są nieuporządkowane, jednak w niektórych przypadkach jest to w porządku.

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

39

dla pierwszego klucza obiektu, którego możesz użyć

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

dla wartości

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

18

Nie ma sposobu na uzyskanie pierwszego elementu, ponieważ „skrypty” (obiekty) w JavaScript mają nieuporządkowane właściwości. Najlepiej jest przechowywać klucze w tablicy:

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

Następnie użyj tego, aby uzyskać odpowiednią wartość:

object[keys[0]]


12

Za pomocą podkreślnika możesz użyć _.pairs, aby uzyskać pierwszy wpis obiektu jako parę klucz-wartość w następujący sposób:

_.pairs(obj)[0]

Wtedy klucz byłby dostępny z kolejnym [0]indeksem dolnym, którego wartość to[1]


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

10

Wczoraj miałem ten sam problem. Rozwiązałem to w ten sposób:

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 jest to najbardziej eleganckie rozwiązanie i jestem całkiem pewien, że może ono przynieść różne wyniki w różnych przeglądarkach (tzn. Specyfikacja mówi, że wyliczenie nie jest wymagane do wyliczenia właściwości w tej samej kolejności, w jakiej zostały zdefiniowane). Jednak miałem w obiekcie tylko jedną właściwość, więc nie było problemu. Potrzebowałem tylko pierwszego klucza.


1
Cześć @PatrikAkerstrand wcześnie przypadkowo kliknąłem downvote. Wprowadź zmiany w odpowiedzi, aby je cofnąć. Przepraszam.
rogeriolino,

7

Możesz 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'} )

6

Aby zdobyć pierwszy klucz swojego obiektu

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

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

// result will return 'foo1'

Jaka jest różnica między tą odpowiedzią a odpowiedzią Jakuba?
JakowL,

Świeższe daje pewność, że ten rodzaj kodu działa idealnie.
Santosh

5

Na podstawie odpowiedzi CMS . Nie otrzymuję wartości bezpośrednio, zamiast tego biorę klucz z jego indeksu i używam tego, 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'

2

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
fajny, tylko… Twój styl kodowania! Co do cholery? te szelki są wszędzie!
latające owce

2
Czy znasz styl python? Właśnie dodałem nawiasy klamrowe ustawione pionowo w stylu python. W każdym razie „Piekło to inni ludzie”, :-D
diyizm
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.