Abrufen des ersten Index eines Objekts


201

Erwägen:

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

Wie würde ich das machen:

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

Offensichtlich funktioniert das nicht, weil der erste Index benannt ist foo, nicht 0.

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

funktioniert, aber ich weiß nicht, dass es foo heißt. Es könnte alles benannt werden. Ich will nur den ersten.

Antworten:


61

Wenn die Reihenfolge der Objekte von Bedeutung ist, sollten Sie Ihr JSON-Schema überarbeiten, um die Objekte in einem Array zu speichern:

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

oder vielleicht:

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

Wie Ben Alpert betont, sind die Eigenschaften von Javascript-Objekten ungeordnet, und Ihr Code ist fehlerhaft, wenn Sie erwarten, dass sie in derselben Reihenfolge aufgelistet werden, in der sie im Objektliteral angegeben sind - es gibt keine "erste" Eigenschaft.


6
Ich habe noch nie gesehen, dass (ich in obj) Dinge in einer anderen Reihenfolge mache. Wollen Sie damit sagen, dass manchmal für (ich in obj) Dinge in einer anderen Reihenfolge rausgeschmissen werden?
Ryan Florence

4
Es ist möglich, dass es wird. Die Spezifikationen besagen, dass es nicht in einer bestimmten Reihenfolge aufgezählt werden muss. Dies bedeutet so ziemlich, dass sich diese Reihenfolge ändern kann.
PatrikAkerstrand

5
Die meisten Browser behalten heutzutage die Einfügereihenfolge bei, aber das war nicht immer der Fall. Es wird von der Spezifikation nicht benötigt, und es gab neuere Versionen von Chrome, bei denen die Einfügereihenfolge nicht beibehalten wurde.
Meilen

1
Als ich tiefer in meine Arbeit einstieg, wurde die Reihenfolge der Dinge wichtiger (ich dachte, ich kümmere mich nur um die erste, aber ich habe mich geirrt!), So dass es klar war, meine Objekte in einem Array zu speichern, wie Sie vorgeschlagen haben.
Ryan Florence

1
Wenn Sie wissen, dass das Objekt nur ein Element enthält, kennen Sie die Reihenfolge.
Danorton

329

Nur zum Spaß funktioniert dies in JS 1.8.5

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

Dies entspricht der Reihenfolge, die Sie sehen würden

for (o in obj) { ... }

24
Klar die beste Option, es sei denn, Steinzeit-Backword-Kompatibilität ist erforderlich.
Dag Sondre Hansen

1
100% die beste Antwort. Dies ist der einfachste und schnellste Weg, dies zu tun.
Fall

3
Nur zur Verdeutlichung, laut en.wikipedia.org/wiki/JavaScript#Version_history wird JS 1.8.5 vor IE9 nicht unterstützt. Leider sind viele Menschen noch in der Steinzeit.
Noremac

Tolle Sache. Kurz und einfach. Danke @Jacob
Sariban D'Cl

Wenn jemand IE9 benutzt, fühle ich seinen Schmerz. danke das ist erstaunlich
CMS

204

Wenn Sie etwas Prägnantes wollen, versuchen Sie:

for (first in obj) break;

alert(first);

als Funktion verpackt:

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

8
In der Antwort von Luke Schafer unten wird die hasOwnProperty-Methode verwendet, um sicherzustellen, dass Sie keine Prototyp-Mitglieder greifen.
Code Commander

3
Damit ein Einzeiler in allen Browsern einschließlich IE8 und darunter funktioniert, verwenden for (var key in obj) if (obj.hasOwnProperty(key)) break;Sie die keyVariable
Ally

funktioniert nicht, wenn das erste Element ein Objekttyp ist. gibt 0 zurück
Schnee

Object.keys(obj)[0];ist viel schneller (0,072 ms) als for(1,644 ms).
Sebastian Ortmann

77

Sie sind nicht wirklich bestellt, aber Sie können tun:

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

Es .hasOwnProperty()ist wichtig, prototypisierte Objekte zu ignorieren.


Im obigen Code ist ein Fehler aufgetreten. Die Art der Prüfung sollte Typ (i) sein
jacob.toye

@ Napalm bezog er sich auf den Fehler im zu überprüfenden Variablennamen, nicht auf die Syntax. Sie haben Recht, aber viele Leute mögen die Klammer für die Lesbarkeit
Luke Schafer

Danke dir. Es ist wunderbar.
Santosh

76

Dies gibt Ihnen nicht das erste, da Javascript-Objekte ungeordnet sind. Dies ist jedoch in einigen Fällen in Ordnung.

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

39

für den ersten Schlüssel des Objekts können Sie verwenden

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

für Wert

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

18

Es gibt keine Möglichkeit, das erste Element abzurufen, da "Hashes" (Objekte) in JavaScript ungeordnete Eigenschaften haben. Am besten speichern Sie die Schlüssel in einem Array:

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

Verwenden Sie das dann, um den richtigen Wert zu erhalten:

object[keys[0]]

16

ES6

const [first] = Object.keys(obj)

Es funktioniert, aber können Sie bitte erklären, wie das funktioniert? Nur den Code zu zeigen, bringt mich nicht dazu, ihn zu verstehen.
Daan

1
Es ist eine destrukturierende Aufgabe . Im Wesentlichen weist es der Variablen in eckigen Klammern das erste Element des zurückgegebenen Arrays zu.
Richard Ayotte

12

Mit dem Unterstrich können Sie _.pairs verwenden, um den ersten Objekteintrag wie folgt als Schlüsselwertpaar abzurufen:

_.pairs(obj)[0]

Dann wäre der Schlüssel mit einem weiteren [0]Index verfügbar , dem Wert mit[1]


Funktioniert am besten, wenn underscore.js verwendet wird. Genau das, was ich brauchte ... Danke, George!
Goldengalaxy

10

Ich hatte gestern das gleiche Problem. Ich habe es so gelöst:

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.

Nicht die eleganteste Lösung, und ich bin mir ziemlich sicher, dass sie in verschiedenen Browsern zu unterschiedlichen Ergebnissen führen kann (dh die Spezifikationen besagen, dass keine Aufzählung erforderlich ist, um die Eigenschaften in derselben Reihenfolge aufzulisten, in der sie definiert wurden). Ich hatte jedoch nur eine einzige Eigenschaft in meinem Objekt, sodass dies kein Problem war. Ich brauchte nur den ersten Schlüssel.


1
Hallo @PatrikAkerstrand früh habe ich versehentlich in downvote geklickt. Bitte nehmen Sie Änderungen an Ihrer Antwort vor, um sie rückgängig zu machen. Es tut uns leid.
Rogeriolino

7

Sie könnten so etwas tun:

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

Um den ersten Schlüssel Ihres Objekts zu erhalten

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

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

// result will return 'foo1'

Was ist der Unterschied zwischen dieser Antwort und der des Jakobs?
YakovL

Es gibt dem Frischer das Vertrauen, dass diese Art von Code perfekt funktioniert.
Santosh

5

Basierend auf CMS Antwort . Ich erhalte den Wert nicht direkt, sondern nehme den Schlüssel an seinem Index und verwende ihn, um den Wert zu erhalten:

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

Meine Lösung:

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
nur nett ... dein Codierungsstil! was zur Hölle? Diese Zahnspangen sind überall!
fliegende Schafe

2
Kennst du den Python-Stil? Ich habe gerade vertikal ausgerichtete Klammern in den Python-Stil eingefügt. Wie auch immer, "Hölle ist andere Leute" ,:
D
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.